{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 电影评论文本分类\n",
    "使用评论文本将影评分为积极（positive）或消极（nagetive）两类。这是一个二元（binary）或者二分类问题，一种重要且应用广泛的机器学习问题。\n",
    "\n",
    "将使用来源于网络电影数据库（Internet Movie Database）的 IMDB 数据集（IMDB dataset），其包含 50,000 条影评文本。从该数据集切割出的25,000条评论用作训练，另外 25,000 条用作测试。训练集与测试集是平衡的（balanced），意味着它们包含相等数量的积极和消极评论。\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.5.0\n"
     ]
    }
   ],
   "source": [
    "import tensorflow as tf\n",
    "from tensorflow import keras\n",
    "\n",
    "import numpy as np\n",
    "\n",
    "print(tf.__version__)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 下载 IMDB 数据集\n",
    "IMDB 数据集已经打包在 Tensorflow 中。该数据集已经经过预处理，评论（单词序列）已经被转换为整数序列，其中每个整数表示字典中的特定单词。\n",
    "\n",
    "以下代码将下载 IMDB 数据集到您的机器上（如果您已经下载过将从缓存中复制）："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/imdb.npz\n",
      "17465344/17464789 [==============================] - 3s 0us/step\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "<__array_function__ internals>:5: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.\n",
      "d:\\anaconda3\\envs\\tensorflow\\lib\\site-packages\\tensorflow\\python\\keras\\datasets\\imdb.py:155: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.\n",
      "  x_train, y_train = np.array(xs[:idx]), np.array(labels[:idx])\n",
      "d:\\anaconda3\\envs\\tensorflow\\lib\\site-packages\\tensorflow\\python\\keras\\datasets\\imdb.py:156: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.\n",
      "  x_test, y_test = np.array(xs[idx:]), np.array(labels[idx:])\n"
     ]
    }
   ],
   "source": [
    "imdb = keras.datasets.imdb\n",
    "\n",
    "(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "【说明】：参数 num_words=10000 保留了训练数据中最常出现的 10,000 个单词。为了保持数据规模的可管理性，低频词将被丢弃。"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 探索数据\n",
    "让我们花一点时间来了解数据格式。该数据集是经过预处理的：每个样本都是一个表示影评中词汇的整数数组。每个标签都是一个值为 0 或 1 的整数值，其中 0 代表消极评论，1 代表积极评论。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training entries: 25000, labels: 25000\n"
     ]
    }
   ],
   "source": [
    "print(\"Training entries: {}, labels: {}\".format(len(train_data), len(train_labels)))"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "评论文本被转换为整数值，其中每个整数代表词典中的一个单词。首条评论是这样的："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1, 14, 22, 16, 43, 530, 973, 1622, 1385, 65, 458, 4468, 66, 3941, 4, 173, 36, 256, 5, 25, 100, 43, 838, 112, 50, 670, 2, 9, 35, 480, 284, 5, 150, 4, 172, 112, 167, 2, 336, 385, 39, 4, 172, 4536, 1111, 17, 546, 38, 13, 447, 4, 192, 50, 16, 6, 147, 2025, 19, 14, 22, 4, 1920, 4613, 469, 4, 22, 71, 87, 12, 16, 43, 530, 38, 76, 15, 13, 1247, 4, 22, 17, 515, 17, 12, 16, 626, 18, 2, 5, 62, 386, 12, 8, 316, 8, 106, 5, 4, 2223, 5244, 16, 480, 66, 3785, 33, 4, 130, 12, 16, 38, 619, 5, 25, 124, 51, 36, 135, 48, 25, 1415, 33, 6, 22, 12, 215, 28, 77, 52, 5, 14, 407, 16, 82, 2, 8, 4, 107, 117, 5952, 15, 256, 4, 2, 7, 3766, 5, 723, 36, 71, 43, 530, 476, 26, 400, 317, 46, 7, 4, 2, 1029, 13, 104, 88, 4, 381, 15, 297, 98, 32, 2071, 56, 26, 141, 6, 194, 7486, 18, 4, 226, 22, 21, 134, 476, 26, 480, 5, 144, 30, 5535, 18, 51, 36, 28, 224, 92, 25, 104, 4, 226, 65, 16, 38, 1334, 88, 12, 16, 283, 5, 16, 4472, 113, 103, 32, 15, 16, 5345, 19, 178, 32]\n"
     ]
    }
   ],
   "source": [
    "print(train_data[0])"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "电影评论可能具有不同的长度。以下代码显示了第一条和第二条评论的中单词数量。由于神经网络的输入必须是统一的长度，我们稍后需要解决这个问题。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(218, 189)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(train_data[0]), len(train_data[1])"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 将整数回转为单词\n",
    "创建一个辅助函数来查询一个包含了整数到字符串映射的字典对象："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 一个映射单词到整数索引的词典\n",
    "word_index = imdb.get_word_index()\n",
    "\n",
    "# 保留第一个索引\n",
    "word_index = {k:(v+3) for k,v in word_index.items()}\n",
    "word_index[\"<PAD>\"] = 0\n",
    "word_index[\"<START>\"] = 1\n",
    "word_index[\"<UNK>\"] = 2  # unknown\n",
    "word_index[\"<UNUSED>\"] = 3\n",
    "\n",
    "reverse_word_index = dict([(value, key) for (key, value) in word_index.items()])\n",
    "\n",
    "def decode_review(text):\n",
    "    return ' '.join([reverse_word_index.get(i, '?') for i in text])"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "使用 decode_review 函数来显示首条评论的文本："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"<START> this film was just brilliant casting location scenery story direction everyone's really suited the part they played and you could just imagine being there robert <UNK> is an amazing actor and now the same being director <UNK> father came from the same scottish island as myself so i loved the fact there was a real connection with this film the witty remarks throughout the film were great it was just brilliant so much that i bought the film as soon as it was released for <UNK> and would recommend it to everyone to watch and the fly fishing was amazing really cried at the end it was so sad and you know what they say if you cry at a film it must have been good and this definitely was also <UNK> to the two little boy's that played the <UNK> of norman and paul they were just brilliant children are often left out of the <UNK> list i think because the stars that play them all grown up are such a big profile for the whole film but these children are amazing and should be praised for what they have done don't you think the whole story was so lovely because it was true and was someone's life after all that was shared with us all\""
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "decode_review(train_data[0])"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 准备数据\n",
    "影评——即整数数组必须在输入神经网络之前转换为张量。这种转换可以通过以下两种方式来完成：\n",
    "* 将数组转换为表示单词出现与否的由 0 和 1 组成的向量，类似于 one-hot 编码。例如，序列[3, 5]将转换为一个 10,000 维的向量，该向量除了索引为 3 和 5 的位置是 1 以外，其他都为 0。然后，将其作为网络的首层——一个可以处理浮点型向量数据的稠密层。不过，这种方法需要大量的内存，需要一个大小为 num_words * num_reviews 的矩阵。\n",
    "* 或者，我们可以填充数组来保证输入数据具有相同的长度，然后创建一个大小为 max_length * num_reviews 的整型张量。我们可以使用能够处理此形状数据的嵌入层作为网络中的第一层。\n",
    "\n",
    "我们将使用第二种方法。由于电影评论长度必须相同，我们将使用 pad_sequences 函数来使长度标准化（填充数据到相同长度）："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_data = keras.preprocessing.sequence.pad_sequences(train_data,\n",
    "                                                        value=word_index[\"<PAD>\"],\n",
    "                                                        padding='post',\n",
    "                                                        maxlen=256)\n",
    "\n",
    "test_data = keras.preprocessing.sequence.pad_sequences(test_data,\n",
    "                                                       value=word_index[\"<PAD>\"],\n",
    "                                                       padding='post',\n",
    "                                                       maxlen=256)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(256, 256)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 查看样本的长度\n",
    "len(train_data[0]), len(train_data[1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[   1   14   22   16   43  530  973 1622 1385   65  458 4468   66 3941\n",
      "    4  173   36  256    5   25  100   43  838  112   50  670    2    9\n",
      "   35  480  284    5  150    4  172  112  167    2  336  385   39    4\n",
      "  172 4536 1111   17  546   38   13  447    4  192   50   16    6  147\n",
      " 2025   19   14   22    4 1920 4613  469    4   22   71   87   12   16\n",
      "   43  530   38   76   15   13 1247    4   22   17  515   17   12   16\n",
      "  626   18    2    5   62  386   12    8  316    8  106    5    4 2223\n",
      " 5244   16  480   66 3785   33    4  130   12   16   38  619    5   25\n",
      "  124   51   36  135   48   25 1415   33    6   22   12  215   28   77\n",
      "   52    5   14  407   16   82    2    8    4  107  117 5952   15  256\n",
      "    4    2    7 3766    5  723   36   71   43  530  476   26  400  317\n",
      "   46    7    4    2 1029   13  104   88    4  381   15  297   98   32\n",
      " 2071   56   26  141    6  194 7486   18    4  226   22   21  134  476\n",
      "   26  480    5  144   30 5535   18   51   36   28  224   92   25  104\n",
      "    4  226   65   16   38 1334   88   12   16  283    5   16 4472  113\n",
      "  103   32   15   16 5345   19  178   32    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0]\n"
     ]
    }
   ],
   "source": [
    "# 检查一下首条评论是否填充\n",
    "print(train_data[0])"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 构建模型\n",
    "神经网络由堆叠的层来构建，这需要从两个主要方面来进行体系结构决策：\n",
    "* 模型里有多少层？\n",
    "* 每个层里有多少隐层单元（hidden units）？\n",
    "在此样本中，输入数据包含一个单词索引的数组。要预测的标签为 0 或 1。让我们来为该问题构建一个模型：\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "embedding (Embedding)        (None, None, 16)          160000    \n",
      "_________________________________________________________________\n",
      "global_average_pooling1d (Gl (None, 16)                0         \n",
      "_________________________________________________________________\n",
      "dense (Dense)                (None, 16)                272       \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 1)                 17        \n",
      "=================================================================\n",
      "Total params: 160,289\n",
      "Trainable params: 160,289\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "# 输入形状是用于电影评论的词汇数目（10,000 词）\n",
    "vocab_size = 10000\n",
    "\n",
    "model = keras.Sequential()\n",
    "model.add(keras.layers.Embedding(vocab_size, 16))\n",
    "model.add(keras.layers.GlobalAveragePooling1D())\n",
    "model.add(keras.layers.Dense(16, activation='relu'))\n",
    "model.add(keras.layers.Dense(1, activation='sigmoid'))\n",
    "\n",
    "model.summary()"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "层按顺序堆叠以构建分类器：\n",
    "* 第一层是嵌入（Embedding）层。该层采用整数编码的词汇表，并查找每个词索引的嵌入向量（embedding vector）。这些向量是通过模型训练学习到的。向量向输出数组增加了一个维度。得到的维度为：(batch, sequence, embedding)。\n",
    "* 接下来，GlobalAveragePooling1D 将通过对序列维度求平均值来为每个样本返回一个定长输出向量。这允许模型以尽可能最简单的方式处理变长输入。\n",
    "* 该定长输出向量通过一个有 16 个隐层单元的全连接（Dense）层传输。\n",
    "* 最后一层与单个输出结点密集连接。使用 Sigmoid 激活函数，其函数值为介于 0 与 1 之间的浮点数，表示概率或置信度。"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 隐层单元\n",
    "上述模型在输入输出之间有两个中间层或“隐藏层”。输出（单元，结点或神经元）的数量即为层表示空间的维度。换句话说，是学习内部表示时网络所允许的自由度。\n",
    "\n",
    "如果模型具有更多的隐层单元（更高维度的表示空间）和/或更多层，则可以学习到更复杂的表示。但是，这会使网络的计算成本更高，并且可能导致学习到不需要的模式——一些能够在训练数据上而不是测试数据上改善性能的模式。这被称为过拟合（overfitting），我们稍后会对此进行探究。"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 损失函数与优化器\n",
    "一个模型需要损失函数和优化器来进行训练。由于这是一个二分类问题且模型输出概率值（一个使用 sigmoid 激活函数的单一单元层），我们将使用 binary_crossentropy 损失函数。\n",
    "\n",
    "这不是损失函数的唯一选择，例如，您可以选择 mean_squared_error 。但是，一般来说 binary_crossentropy 更适合处理概率——它能够度量概率分布之间的“距离”，或者在我们的示例中，指的是度量 ground-truth 分布与预测值之间的“距离”。\n",
    "\n",
    "现在，配置模型来使用优化器和损失函数："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.compile(optimizer='adam',\n",
    "              loss='binary_crossentropy',\n",
    "              metrics=['accuracy'])"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 创建验证集\n",
    "在训练时，我们想要检查模型在未见过的数据上的准确率（accuracy）。通过从原始训练数据中分离 10,000 个样本来创建一个验证集。（为什么现在不使用测试集？我们的目标是只使用训练数据来开发和调整模型，然后只使用一次测试数据来评估准确率（accuracy））。\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "x_val = train_data[:10000]\n",
    "partial_x_train = train_data[10000:]\n",
    "\n",
    "y_val = train_labels[:10000]\n",
    "partial_y_train = train_labels[10000:]"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 训练模型\n",
    "以 512 个样本的 mini-batch 大小迭代 40 个 epoch 来训练模型。这是指对 x_train 和 y_train 张量中所有样本的的 40 次迭代。在训练过程中，监测来自验证集的 10,000 个样本上的损失值（loss）和准确率（accuracy）："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/40\n",
      "30/30 [==============================] - 2s 33ms/step - loss: 0.6920 - accuracy: 0.5492 - val_loss: 0.6901 - val_accuracy: 0.6634\n",
      "Epoch 2/40\n",
      "30/30 [==============================] - 1s 29ms/step - loss: 0.6866 - accuracy: 0.6679 - val_loss: 0.6821 - val_accuracy: 0.6359\n",
      "Epoch 3/40\n",
      "30/30 [==============================] - 1s 24ms/step - loss: 0.6743 - accuracy: 0.7047 - val_loss: 0.6663 - val_accuracy: 0.7072\n",
      "Epoch 4/40\n",
      "30/30 [==============================] - 1s 23ms/step - loss: 0.6525 - accuracy: 0.7347 - val_loss: 0.6410 - val_accuracy: 0.7604\n",
      "Epoch 5/40\n",
      "30/30 [==============================] - 1s 22ms/step - loss: 0.6193 - accuracy: 0.7820 - val_loss: 0.6053 - val_accuracy: 0.7886\n",
      "Epoch 6/40\n",
      "30/30 [==============================] - 1s 22ms/step - loss: 0.5760 - accuracy: 0.8125 - val_loss: 0.5629 - val_accuracy: 0.7974\n",
      "Epoch 7/40\n",
      "30/30 [==============================] - 1s 22ms/step - loss: 0.5276 - accuracy: 0.8337 - val_loss: 0.5184 - val_accuracy: 0.8218\n",
      "Epoch 8/40\n",
      "30/30 [==============================] - 1s 23ms/step - loss: 0.4792 - accuracy: 0.8530 - val_loss: 0.4762 - val_accuracy: 0.8366\n",
      "Epoch 9/40\n",
      "30/30 [==============================] - 1s 22ms/step - loss: 0.4350 - accuracy: 0.8640 - val_loss: 0.4401 - val_accuracy: 0.8423\n",
      "Epoch 10/40\n",
      "30/30 [==============================] - 1s 21ms/step - loss: 0.3958 - accuracy: 0.8747 - val_loss: 0.4082 - val_accuracy: 0.8532\n",
      "Epoch 11/40\n",
      "30/30 [==============================] - 1s 22ms/step - loss: 0.3615 - accuracy: 0.8835 - val_loss: 0.3826 - val_accuracy: 0.8611\n",
      "Epoch 12/40\n",
      "30/30 [==============================] - 1s 23ms/step - loss: 0.3332 - accuracy: 0.8912 - val_loss: 0.3621 - val_accuracy: 0.8658\n",
      "Epoch 13/40\n",
      "30/30 [==============================] - 1s 22ms/step - loss: 0.3094 - accuracy: 0.8966 - val_loss: 0.3460 - val_accuracy: 0.8712\n",
      "Epoch 14/40\n",
      "30/30 [==============================] - 1s 23ms/step - loss: 0.2889 - accuracy: 0.9030 - val_loss: 0.3330 - val_accuracy: 0.8726\n",
      "Epoch 15/40\n",
      "30/30 [==============================] - 1s 22ms/step - loss: 0.2710 - accuracy: 0.9083 - val_loss: 0.3228 - val_accuracy: 0.8754\n",
      "Epoch 16/40\n",
      "30/30 [==============================] - 1s 22ms/step - loss: 0.2555 - accuracy: 0.9125 - val_loss: 0.3137 - val_accuracy: 0.8761\n",
      "Epoch 17/40\n",
      "30/30 [==============================] - 1s 22ms/step - loss: 0.2414 - accuracy: 0.9181 - val_loss: 0.3069 - val_accuracy: 0.8786\n",
      "Epoch 18/40\n",
      "30/30 [==============================] - 1s 22ms/step - loss: 0.2286 - accuracy: 0.9219 - val_loss: 0.3008 - val_accuracy: 0.8817\n",
      "Epoch 19/40\n",
      "30/30 [==============================] - 1s 25ms/step - loss: 0.2172 - accuracy: 0.9253 - val_loss: 0.2968 - val_accuracy: 0.8807\n",
      "Epoch 20/40\n",
      "30/30 [==============================] - 1s 25ms/step - loss: 0.2071 - accuracy: 0.9299 - val_loss: 0.2927 - val_accuracy: 0.8833\n",
      "Epoch 21/40\n",
      "30/30 [==============================] - 1s 24ms/step - loss: 0.1967 - accuracy: 0.9333 - val_loss: 0.2920 - val_accuracy: 0.8805\n",
      "Epoch 22/40\n",
      "30/30 [==============================] - 1s 24ms/step - loss: 0.1881 - accuracy: 0.9368 - val_loss: 0.2872 - val_accuracy: 0.8839\n",
      "Epoch 23/40\n",
      "30/30 [==============================] - 1s 22ms/step - loss: 0.1799 - accuracy: 0.9412 - val_loss: 0.2857 - val_accuracy: 0.8834\n",
      "Epoch 24/40\n",
      "30/30 [==============================] - 1s 22ms/step - loss: 0.1716 - accuracy: 0.9449 - val_loss: 0.2862 - val_accuracy: 0.8830\n",
      "Epoch 25/40\n",
      "30/30 [==============================] - 1s 23ms/step - loss: 0.1644 - accuracy: 0.9483 - val_loss: 0.2842 - val_accuracy: 0.8852\n",
      "Epoch 26/40\n",
      "30/30 [==============================] - 1s 24ms/step - loss: 0.1575 - accuracy: 0.9510 - val_loss: 0.2851 - val_accuracy: 0.8864\n",
      "Epoch 27/40\n",
      "30/30 [==============================] - 1s 23ms/step - loss: 0.1510 - accuracy: 0.9538 - val_loss: 0.2852 - val_accuracy: 0.8862\n",
      "Epoch 28/40\n",
      "30/30 [==============================] - 1s 22ms/step - loss: 0.1446 - accuracy: 0.9555 - val_loss: 0.2852 - val_accuracy: 0.8850\n",
      "Epoch 29/40\n",
      "30/30 [==============================] - 1s 23ms/step - loss: 0.1390 - accuracy: 0.9579 - val_loss: 0.2868 - val_accuracy: 0.8849\n",
      "Epoch 30/40\n",
      "30/30 [==============================] - 1s 23ms/step - loss: 0.1333 - accuracy: 0.9606 - val_loss: 0.2874 - val_accuracy: 0.8849\n",
      "Epoch 31/40\n",
      "30/30 [==============================] - 1s 22ms/step - loss: 0.1279 - accuracy: 0.9635 - val_loss: 0.2898 - val_accuracy: 0.8839\n",
      "Epoch 32/40\n",
      "30/30 [==============================] - 1s 22ms/step - loss: 0.1228 - accuracy: 0.9654 - val_loss: 0.2907 - val_accuracy: 0.8845\n",
      "Epoch 33/40\n",
      "30/30 [==============================] - 1s 22ms/step - loss: 0.1180 - accuracy: 0.9669 - val_loss: 0.2930 - val_accuracy: 0.8852\n",
      "Epoch 34/40\n",
      "30/30 [==============================] - 1s 23ms/step - loss: 0.1136 - accuracy: 0.9684 - val_loss: 0.2962 - val_accuracy: 0.8846\n",
      "Epoch 35/40\n",
      "30/30 [==============================] - 1s 22ms/step - loss: 0.1092 - accuracy: 0.9706 - val_loss: 0.2989 - val_accuracy: 0.8827\n",
      "Epoch 36/40\n",
      "30/30 [==============================] - 1s 22ms/step - loss: 0.1055 - accuracy: 0.9717 - val_loss: 0.3003 - val_accuracy: 0.8831\n",
      "Epoch 37/40\n",
      "30/30 [==============================] - 1s 22ms/step - loss: 0.1014 - accuracy: 0.9726 - val_loss: 0.3042 - val_accuracy: 0.8844\n",
      "Epoch 38/40\n",
      "30/30 [==============================] - 1s 21ms/step - loss: 0.0975 - accuracy: 0.9745 - val_loss: 0.3090 - val_accuracy: 0.8826\n",
      "Epoch 39/40\n",
      "30/30 [==============================] - 1s 22ms/step - loss: 0.0950 - accuracy: 0.9755 - val_loss: 0.3114 - val_accuracy: 0.8824\n",
      "Epoch 40/40\n",
      "30/30 [==============================] - 1s 22ms/step - loss: 0.0907 - accuracy: 0.9773 - val_loss: 0.3131 - val_accuracy: 0.8829\n"
     ]
    }
   ],
   "source": [
    "history = model.fit(partial_x_train,\n",
    "                    partial_y_train,\n",
    "                    epochs=40,\n",
    "                    batch_size=512,\n",
    "                    validation_data=(x_val, y_val),\n",
    "                    verbose=1)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 评估模型\n",
    "我们来看一下模型的性能如何。将返回两个值。损失值（loss）（一个表示误差的数字，值越低越好）与准确率（accuracy）。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "782/782 - 1s - loss: 0.3343 - accuracy: 0.8719\n",
      "[0.33431577682495117, 0.8718799948692322]\n"
     ]
    }
   ],
   "source": [
    "results = model.evaluate(test_data,  test_labels, verbose=2)\n",
    "\n",
    "print(results)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 创建一个准确率（accuracy）和损失值（loss）随时间变化的图表\n",
    "model.fit() 返回一个 History 对象，该对象包含一个字典，其中包含训练阶段所发生的一切事件："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dict_keys(['loss', 'accuracy', 'val_loss', 'val_accuracy'])"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "history_dict = history.history\n",
    "history_dict.keys()"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "有四个条目：在训练和验证期间，每个条目对应一个监控指标。我们可以使用这些条目来绘制训练与验证过程的损失值（loss）和准确率（accuracy），以便进行比较。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAHHCAYAAABDUnkqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABh4klEQVR4nO3deVxU5f4H8M8AMoDKoiCLIKiZu6ioXPTikhRauaGGpolmWuaa2VWuud+03HdNyyUrNQ2XNFeCcqE0lTIj0kIlBdxBQUFnzu+P5zcjAwPMwAyHGT7v1+u8ZuaZM+d8jwecL8+qkCRJAhEREZGVsJE7ACIiIiJTYnJDREREVoXJDREREVkVJjdERERkVZjcEBERkVVhckNERERWhckNERERWRUmN0RERGRVmNwQERGRVWFyQySDoUOHIiAgoFSfnTlzJhQKhWkDqmAuX74MhUKBTZs2let54+PjoVAoEB8fry0z9F6ZK+aAgAAMHTrUpMc0xKZNm6BQKHD58uVyPzdRWTG5IcpHoVAYtOX/8iMqq5MnT2LmzJm4d++e3KEQWQU7uQMgqki2bNmi8/qzzz7DkSNHCpU3bty4TOdZv3491Gp1qT77/vvvY8qUKWU6PxmuLPfKUCdPnsSsWbMwdOhQuLq66ryXnJwMGxv+HUpkDCY3RPkMHjxY5/WPP/6II0eOFCovKCcnB05OTgafp0qVKqWKDwDs7OxgZ8df3fJSlntlCkqlUtbzE1ki/jlAZKTOnTujWbNmOHPmDDp27AgnJyf897//BQDs2bMHL730Enx8fKBUKlG/fn3MmTMHKpVK5xgF+3Fo+mssXLgQ69atQ/369aFUKtG2bVucPn1a57P6+twoFAqMGTMGu3fvRrNmzaBUKtG0aVMcPHiwUPzx8fFo06YNHBwcUL9+fXz88ccG9+M5duwY+vfvjzp16kCpVMLPzw/vvPMOHj58WOj6qlWrhmvXrqF3796oVq0aPDw8MGnSpEL/Fvfu3cPQoUPh4uICV1dXREVFGdQ88/PPP0OhUGDz5s2F3jt06BAUCgX27dsHALhy5QrefvttNGzYEI6OjqhZsyb69+9vUH8SfX1uDI35119/xdChQ1GvXj04ODjAy8sLr7/+Om7fvq3dZ+bMmXjvvfcAAHXr1tU2fWpi09fn5u+//0b//v1Ro0YNODk54V//+hf279+vs4+m/9BXX32FDz74AL6+vnBwcEDXrl1x6dKlEq+7KKtXr0bTpk2hVCrh4+OD0aNHF7r2ixcvom/fvvDy8oKDgwN8fX0xYMAAZGZmavc5cuQI/v3vf8PV1RXVqlVDw4YNtb9HRGXFP/+ISuH27dvo3r07BgwYgMGDB8PT0xOA6IRZrVo1TJw4EdWqVcN3332H6dOnIysrCwsWLCjxuF9++SXu37+PN998EwqFAvPnz0dERAT+/vvvEmsQjh8/jpiYGLz99tuoXr06li9fjr59++Lq1auoWbMmAODcuXPo1q0bvL29MWvWLKhUKsyePRseHh4GXfeOHTuQk5ODUaNGoWbNmjh16hRWrFiBf/75Bzt27NDZV6VSITw8HMHBwVi4cCGOHj2KRYsWoX79+hg1ahQAQJIk9OrVC8ePH8dbb72Fxo0bY9euXYiKiioxljZt2qBevXr46quvCu2/fft2uLm5ITw8HABw+vRpnDx5EgMGDICvry8uX76MNWvWoHPnzvj999+NqnUzJuYjR47g77//xrBhw+Dl5YULFy5g3bp1uHDhAn788UcoFApERETgzz//xNatW7FkyRK4u7sDQJH3JCMjA+3bt0dOTg7GjRuHmjVrYvPmzejZsyd27tyJPn366Oz/4YcfwsbGBpMmTUJmZibmz5+PQYMG4aeffjL4mjVmzpyJWbNmISwsDKNGjUJycjLWrFmD06dP48SJE6hSpQry8vIQHh6O3NxcjB07Fl5eXrh27Rr27duHe/fuwcXFBRcuXMDLL7+MFi1aYPbs2VAqlbh06RJOnDhhdExEeklEVKTRo0dLBX9NOnXqJAGQ1q5dW2j/nJycQmVvvvmm5OTkJD169EhbFhUVJfn7+2tfp6SkSACkmjVrSnfu3NGW79mzRwIgffPNN9qyGTNmFIoJgGRvby9dunRJW/bLL79IAKQVK1Zoy3r06CE5OTlJ165d05ZdvHhRsrOzK3RMffRd37x58ySFQiFduXJF5/oASLNnz9bZt1WrVlJQUJD29e7duyUA0vz587VlT548kUJDQyUA0saNG4uNJzo6WqpSpYrOv1lubq7k6uoqvf7668XGnZCQIAGQPvvsM21ZXFycBECKi4vTuZb898qYmPWdd+vWrRIA6YcfftCWLViwQAIgpaSkFNrf399fioqK0r6eMGGCBEA6duyYtuz+/ftS3bp1pYCAAEmlUulcS+PGjaXc3FztvsuWLZMASOfPny90rvw2btyoE9ONGzcke3t76YUXXtCeQ5IkaeXKlRIAacOGDZIkSdK5c+ckANKOHTuKPPaSJUskANLNmzeLjYGotNgsRVQKSqUSw4YNK1Tu6OiofX7//n3cunULoaGhyMnJwR9//FHicSMjI+Hm5qZ9HRoaCkA0Q5QkLCwM9evX175u0aIFnJ2dtZ9VqVQ4evQoevfuDR8fH+1+zzzzDLp3717i8QHd68vOzsatW7fQvn17SJKEc+fOFdr/rbfe0nkdGhqqcy3ffvst7OzstDU5AGBra4uxY8caFE9kZCQeP36MmJgYbdnhw4dx7949REZG6o378ePHuH37Np555hm4urri7NmzBp2rNDHnP++jR49w69Yt/Otf/wIAo8+b//zt2rXDv//9b21ZtWrVMHLkSFy+fBm///67zv7Dhg2Dvb299rUxP1P5HT16FHl5eZgwYYJOB+cRI0bA2dlZ2yzm4uICQDQN5uTk6D2WptP0nj17zN5ZmyonJjdEpVC7dm2dLwyNCxcuoE+fPnBxcYGzszM8PDy0nZHz9zcoSp06dXReaxKdu3fvGv1Zzec1n71x4wYePnyIZ555ptB++sr0uXr1KoYOHYoaNWpo+9F06tQJQOHrc3BwKNS0kj8eQPSF8fb2RrVq1XT2a9iwoUHxBAYGolGjRti+fbu2bPv27XB3d8dzzz2nLXv48CGmT58OPz8/KJVKuLu7w8PDA/fu3TPovuRnTMx37tzB+PHj4enpCUdHR3h4eKBu3boADPt5KOr8+s6lGcF35coVnfKy/EwVPC9Q+Drt7e1Rr1497ft169bFxIkT8cknn8Dd3R3h4eFYtWqVzvVGRkaiQ4cOeOONN+Dp6YkBAwbgq6++YqJDJsM+N0SlkP8vco179+6hU6dOcHZ2xuzZs1G/fn04ODjg7NmzmDx5skH/cdva2uotlyTJrJ81hEqlwvPPP487d+5g8uTJaNSoEapWrYpr165h6NChha6vqHhMLTIyEh988AFu3bqF6tWrY+/evRg4cKDOiLKxY8di48aNmDBhAkJCQuDi4gKFQoEBAwaY9Qv1lVdewcmTJ/Hee++hZcuWqFatGtRqNbp161ZuX+Tm/rnQZ9GiRRg6dCj27NmDw4cPY9y4cZg3bx5+/PFH+Pr6wtHRET/88APi4uKwf/9+HDx4ENu3b8dzzz2Hw4cPl9vPDlkvJjdEJhIfH4/bt28jJiYGHTt21JanpKTIGNVTtWrVgoODg96RMoaMnjl//jz+/PNPbN68GUOGDNGWHzlypNQx+fv7IzY2Fg8ePNCpCUlOTjb4GJGRkZg1axa+/vpreHp6IisrCwMGDNDZZ+fOnYiKisKiRYu0ZY8ePSrVpHmGxnz37l3ExsZi1qxZmD59urb84sWLhY5pzIzT/v7+ev99NM2e/v7+Bh/LGJrjJicno169etryvLw8pKSkICwsTGf/5s2bo3nz5nj//fdx8uRJdOjQAWvXrsX//vc/AICNjQ26du2Krl27YvHixZg7dy6mTp2KuLi4QsciMhabpYhMRPPXZv6/iPPy8rB69Wq5QtJha2uLsLAw7N69G9evX9eWX7p0CQcOHDDo84Du9UmShGXLlpU6phdffBFPnjzBmjVrtGUqlQorVqww+BiNGzdG8+bNsX37dmzfvh3e3t46yaUm9oI1FStWrCg0LN2UMev79wKApUuXFjpm1apVAcCgZOvFF1/EqVOnkJCQoC3Lzs7GunXrEBAQgCZNmhh6KUYJCwuDvb09li9frnNNn376KTIzM/HSSy8BALKysvDkyROdzzZv3hw2NjbIzc0FIJrrCmrZsiUAaPchKgvW3BCZSPv27eHm5oaoqCiMGzcOCoUCW7ZsMWv1v7FmzpyJw4cPo0OHDhg1ahRUKhVWrlyJZs2aITExsdjPNmrUCPXr18ekSZNw7do1ODs74+uvvza670Z+PXr0QIcOHTBlyhRcvnwZTZo0QUxMjNH9USIjIzF9+nQ4ODhg+PDhhWb0ffnll7Flyxa4uLigSZMmSEhIwNGjR7VD5M0Rs7OzMzp27Ij58+fj8ePHqF27Ng4fPqy3Ji8oKAgAMHXqVAwYMABVqlRBjx49tElPflOmTMHWrVvRvXt3jBs3DjVq1MDmzZuRkpKCr7/+2myzGXt4eCA6OhqzZs1Ct27d0LNnTyQnJ2P16tVo27attm/Zd999hzFjxqB///549tln8eTJE2zZsgW2trbo27cvAGD27Nn44Ycf8NJLL8Hf3x83btzA6tWr4evrq9NRmqi0mNwQmUjNmjWxb98+vPvuu3j//ffh5uaGwYMHo2vXrtr5VuQWFBSEAwcOYNKkSZg2bRr8/Pwwe/ZsJCUllTiaq0qVKvjmm2+0/SccHBzQp08fjBkzBoGBgaWKx8bGBnv37sWECRPw+eefQ6FQoGfPnli0aBFatWpl8HEiIyPx/vvvIycnR2eUlMayZctga2uLL774Ao8ePUKHDh1w9OjRUt0XY2L+8ssvMXbsWKxatQqSJOGFF17AgQMHdEarAUDbtm0xZ84crF27FgcPHoRarUZKSore5MbT0xMnT57E5MmTsWLFCjx69AgtWrTAN998o609MZeZM2fCw8MDK1euxDvvvIMaNWpg5MiRmDt3rnYepsDAQISHh+Obb77BtWvX4OTkhMDAQBw4cEA7Uqxnz564fPkyNmzYgFu3bsHd3R2dOnXCrFmztKOtiMpCIVWkPyuJSBa9e/fGhQsX9PYHISKyNOxzQ1TJFFwq4eLFi/j222/RuXNneQIiIjIx1twQVTLe3t7a9Y6uXLmCNWvWIDc3F+fOnUODBg3kDo+IqMzY54aokunWrRu2bt2K9PR0KJVKhISEYO7cuUxsiMhqsOaGiIiIrAr73BAREZFVYXJDREREVqXS9blRq9W4fv06qlevbtSU50RERCQfSZJw//59+Pj4lDhZZaVLbq5fvw4/Pz+5wyAiIqJSSE1Nha+vb7H7VLrkpnr16gDEP46zs7PM0RAREZEhsrKy4Ofnp/0eL06lS240TVHOzs5MboiIiCyMIV1K2KGYiIiIrAqTGyIiIrIqTG6IiIjIqlS6PjdERGRaKpUKjx8/ljsMsgL29vYlDvM2BJMbIiIqFUmSkJ6ejnv37skdClkJGxsb1K1bF/b29mU6ToVIblatWoUFCxYgPT0dgYGBWLFiBdq1a6d3386dO+P7778vVP7iiy9i//795g6ViIj+nyaxqVWrFpycnDgxKpWJZpLdtLQ01KlTp0w/T7InN9u3b8fEiROxdu1aBAcHY+nSpQgPD0dycjJq1apVaP+YmBjk5eVpX9++fRuBgYHo379/eYZNRFSpqVQqbWJTs2ZNucMhK+Hh4YHr16/jyZMnqFKlSqmPI3uH4sWLF2PEiBEYNmwYmjRpgrVr18LJyQkbNmzQu3+NGjXg5eWl3Y4cOQInJycmN0RE5UjTx8bJyUnmSMiaaJqjVCpVmY4ja3KTl5eHM2fOICwsTFtmY2ODsLAwJCQkGHSMTz/9FAMGDEDVqlX1vp+bm4usrCydjYiITINNUWRKpvp5kjW5uXXrFlQqFTw9PXXKPT09kZ6eXuLnT506hd9++w1vvPFGkfvMmzcPLi4u2s1c60qpVEB8PLB1q3gsY9JJREREpSR7s1RZfPrpp2jevHmRnY8BIDo6GpmZmdotNTXV5HHExAABAUCXLsCrr4rHgABRTkRE1i8gIABLly41eP/4+HgoFAqzjzTbtGkTXF1dzXqOikjW5Mbd3R22trbIyMjQKc/IyICXl1exn83Ozsa2bdswfPjwYvdTKpXadaTMsZ5UTAzQrx/wzz+65deuiXImOERExSvPmm+FQlHsNnPmzFId9/Tp0xg5cqTB+7dv3x5paWlwcXEp1fmoeLImN/b29ggKCkJsbKy2TK1WIzY2FiEhIcV+dseOHcjNzcXgwYPNHWaRVCpg/HhAkgq/pymbMKHwLyqbsIiIhPKu+U5LS9NuS5cuhbOzs07ZpEmTtPtKkoQnT54YdFwPDw+jOlfb29vDy8uLfZbMRPZmqYkTJ2L9+vXYvHkzkpKSMGrUKGRnZ2PYsGEAgCFDhiA6OrrQ5z799FP07t1b1iGIx44VrrHJT5KA1FSxnwabsIiIBDlqvvOPtnVxcYFCodC+/uOPP1C9enUcOHAAQUFBUCqVOH78OP766y/06tULnp6eqFatGtq2bYujR4/qHLdgs5RCocAnn3yCPn36wMnJCQ0aNMDevXu17xdsltI0Hx06dAiNGzdGtWrV0K1bN6SlpWk/8+TJE4wbNw6urq6oWbMmJk+ejKioKPTu3duof4M1a9agfv36sLe3R8OGDbFlyxbte5IkYebMmahTpw6USiV8fHwwbtw47furV69GgwYN4ODgAE9PT/Tr18+oc5cX2ZObyMhILFy4ENOnT0fLli2RmJiIgwcPajsZX716VefmAkBycjKOHz9eYpOUuRUIq8T92IRFRCSUtua7PEyZMgUffvghkpKS0KJFCzx48AAvvvgiYmNjce7cOXTr1g09evTA1atXiz3OrFmz8Morr+DXX3/Fiy++iEGDBuHOnTtF7p+Tk4OFCxdiy5Yt+OGHH3D16lWdmqSPPvoIX3zxBTZu3IgTJ04gKysLu3fvNuradu3ahfHjx+Pdd9/Fb7/9hjfffBPDhg1DXFwcAODrr7/GkiVL8PHHH+PixYvYvXs3mjdvDgD4+eefMW7cOMyePRvJyck4ePAgOnbsaNT5y41UyWRmZkoApMzMzDIfKy5OksSvYfHb0aOS9OSJJPn6Fr2PQiFJfn5iPyKiiu7hw4fS77//Lj18+LBUnzf0/8+4OJOGrWPjxo2Si4tLvpjiJADS7t27S/xs06ZNpRUrVmhf+/v7S0uWLNG+BiC9//772tcPHjyQAEgHDhzQOdfdu3e1sQCQLl26pP3MqlWrJE9PT+1rT09PacGCBdrXT548kerUqSP16tXL4Gts3769NGLECJ19+vfvL7344ouSJEnSokWLpGeffVbKy8srdKyvv/5acnZ2lrKysoo8X1kV93NlzPe37DU3liw0FPD1BUpqMh08GHjtNeObsIiIrJWxNd/lqU2bNjqvHzx4gEmTJqFx48ZwdXVFtWrVkJSUVGLNTYsWLbTPq1atCmdnZ9y4caPI/Z2cnFC/fn3ta29vb+3+mZmZyMjI0BkdbGtri6CgIKOuLSkpCR06dNAp69ChA5KSkgAA/fv3x8OHD1GvXj2MGDECu3bt0vY7ev755+Hv74969erhtddewxdffIGcnByjzl9emNyUga0tsGyZeF5UguPsDKSni87DhpDjF5mIqLx5e5t2P1MqOCnspEmTsGvXLsydOxfHjh1DYmIimjdvrrMUkD4Flw9QKBRQq9VG7S/pa7czIz8/PyQnJ2P16tVwdHTE22+/jY4dO+Lx48eoXr06zp49i61bt8Lb2xvTp09HYGBghVw4lclNGUVEADt3ArVr65b7+QFffw3cvCkeg4MNO54cv8hEROWtpJpvhUL8PxoaWr5x6XPixAkMHToUffr0QfPmzeHl5YXLly+XawwuLi7w9PTE6dOntWUqlQpnz5416jiNGzfGiRMndMpOnDiBJk2aaF87OjqiR48eWL58OeLj45GQkIDz588DAOzs7BAWFob58+fj119/xeXLl/Hdd9+V4crMQ/aFM61BRATQq5doUkpLEwlKaKio2cn/vp9f0TUzCoX4Rdf3i6xSFX1sIiJLpKn57tdP/P+Xv4JCk/AsXVox/q9r0KABYmJi0KNHDygUCkybNq3YGhhzGTt2LObNm4dnnnkGjRo1wooVK3D37l2jhpO/9957eOWVV9CqVSuEhYXhm2++QUxMjHb016ZNm6BSqRAcHAwnJyd8/vnncHR0hL+/P/bt24e///4bHTt2hJubG7799luo1Wo0bNjQXJdcaqy5MRFbW6BzZ2DgQPFY8BfS1hZYubLov1IkCVi8uPDnOHSciKxVUTXfvr6iPCJCnrgKWrx4Mdzc3NC+fXv06NED4eHhaN26dbnHMXnyZAwcOBBDhgxBSEgIqlWrhvDwcDg4OBh8jN69e2PZsmVYuHAhmjZtio8//hgbN25E586dAQCurq5Yv349OnTogBYtWuDo0aP45ptvULNmTbi6uiImJgbPPfccGjdujLVr12Lr1q1o2rSpma649BRSeTfoySwrKwsuLi7IzMw0+WzFhoiJEcMf9XUufvllYPNmoEaNp/v261d4qKQmQapIv/xEVLk8evQIKSkpqFu3rlFfrvqwdrp01Go1GjdujFdeeQVz5syROxyTKO7nypjvbzZLlbOCTVheXsCff4qEZ98+oHVrYMcO8VjcHBAKhZgDolcv/idARJZNU/NNxbty5QoOHz6MTp06ITc3FytXrkRKSgpeffVVuUOrcJjcyKDgL3KXLkC7dkD//sBffwEdOgCjRhk+dJz/KRARWT8bGxts2rQJkyZNgiRJaNasGY4ePYrGjRvLHVqFw+SmgmjVCjhzBhg2DNi1C1i+3LDPceg4EVHl4OfnV2ikE+nHDsUViIuLGDa+ZInhTU0cOk5ERKSLyU0Fo+lLEx9ffIJTkeaAICIiqkiY3FRQ//438Mkn+t+raHNAEBERVSRMbiqwoUPFyKmCI94q2hwQREREFQmTmwquXz/gzh1g4kTxWqEQnY2Z2BAREenH5MYC2NoCixaJ4eGSBAwZAvz+u9xRERERVUxMbizIsmVAp07A/fti8r67d/Xvp1KJDslbt4pHlao8oyQisn6dO3fGhAkTtK8DAgKwdOnSYj+jUCiwe/fuMp/bVMcpzsyZM9GyZUuznsOcmNxYkCpVRB8cf3/g0iUgMhJ48kR3H65FRURUtB49eqBbt2563zt27BgUCgV+/fVXo497+vRpjBw5sqzh6SgqwUhLS0P37t1Nei5rw+TGwnh4AHv2AE5OwJEjwOTJT9/TrEVVcGbja9dEORMcIqrshg8fjiNHjuAfPVPAb9y4EW3atEGLFi2MPq6HhwecnJxMEWKJvLy8oFQqy+VclorJjQUKDBQLbAJiJfHPPhNNT8WtRQWI+XPYREVEldnLL78MDw8PbNq0Saf8wYMH2LFjB4YPH47bt29j4MCBqF27NpycnNC8eXNs3bq12OMWbJa6ePEiOnbsCAcHBzRp0gRHjhwp9JnJkyfj2WefhZOTE+rVq4dp06bh8ePHAIBNmzZh1qxZ+OWXX6BQKKBQKLQxF2yWOn/+PJ577jk4OjqiZs2aGDlyJB48eKB9f+jQoejduzcWLlwIb29v1KxZE6NHj9aeyxBqtRqzZ8+Gr68vlEolWrZsiYMHD2rfz8vLw5gxY+Dt7Q0HBwf4+/tj3rx5AABJkjBz5kzUqVMHSqUSPj4+GDdunMHnLg0uv2Ch+vUDpk0D5swBRo4EHjzgWlREJC9JAnJy5Dm3k9PTOcCKY2dnhyFDhmDTpk2YOnUqFP//oR07dkClUmHgwIF48OABgoKCMHnyZDg7O2P//v147bXXUL9+fbRr167Ec6jVakRERMDT0xM//fQTMjMzdfrnaFSvXh2bNm2Cj48Pzp8/jxEjRqB69er4z3/+g8jISPz22284ePAgjh49CgBwcXEpdIzs7GyEh4cjJCQEp0+fxo0bN/DGG29gzJgxOglcXFwcvL29ERcXh0uXLiEyMhItW7bEiBEjSv5HA7Bs2TIsWrQIH3/8MVq1aoUNGzagZ8+euHDhAho0aIDly5dj7969+Oqrr1CnTh2kpqYiNTUVAPD1119jyZIl2LZtG5o2bYr09HT88ssvBp231KRKJjMzUwIgZWZmyh1KmalUktSrlyQBkuTqKh5L2r78Uu6oicgaPHz4UPr999+lhw8fassePDDs/yFzbA8eGB57UlKSBECKi4vTloWGhkqDBw8u8jMvvfSS9O6772pfd+rUSRo/frz2tb+/v7RkyRJJkiTp0KFDkp2dnXTt2jXt+wcOHJAASLt27SryHAsWLJCCgoK0r2fMmCEFBgYW2i//cdatWye5ublJD/L9A+zfv1+ysbGR0tPTJUmSpKioKMnf31968uSJdp/+/ftLkZGRRcZS8Nw+Pj7SBx98oLNP27ZtpbfffluSJEkaO3as9Nxzz0lqtbrQsRYtWiQ9++yzUl5eXpHn09D3c6VhzPc3m6UsmI0NsGUL0LQpcO+eYZ/hWlREVNk1atQI7du3x4YNGwAAly5dwrFjxzB8+HAAgEqlwpw5c9C8eXPUqFED1apVw6FDh3D16lWDjp+UlAQ/Pz/4+Phoy0JCQgrtt337dnTo0AFeXl6oVq0a3n//fYPPkf9cgYGBqFq1qrasQ4cOUKvVSE5O1pY1bdoUtvmmtPf29saNGzcMOkdWVhauX7+ODh066JR36NABSUlJAETTV2JiIho2bIhx48bh8OHD2v369++Phw8fol69ehgxYgR27dqFJwVHw5gYkxsLV7266GDs5lb8flyLiojMzclJNJHLsRnbl3f48OH4+uuvcf/+fWzcuBH169dHp06dAAALFizAsmXLMHnyZMTFxSExMRHh4eHIy8sz2b9VQkICBg0ahBdffBH79u3DuXPnMHXqVJOeI78qVarovFYoFFCr1SY7fuvWrZGSkoI5c+bg4cOHeOWVV9CvXz8AYjXz5ORkrF69Go6Ojnj77bfRsWNHo/r8GIvJjRWoXx/46itRk6MP16IiovKgUABVq8qzGdLfJr9XXnkFNjY2+PLLL/HZZ5/h9ddf1/a/OXHiBHr16oXBgwcjMDAQ9erVw59//mnwsRs3bozU1FSkpaVpy3788UedfU6ePAl/f39MnToVbdq0QYMGDXDlyhWdfezt7aEqYRRI48aN8csvvyA7O1tbduLECdjY2KBhw4YGx1wcZ2dn+Pj44MSJEzrlJ06cQJMmTXT2i4yMxPr167F9+3Z8/fXXuHPnDgDA0dERPXr0wPLlyxEfH4+EhAScP3/eJPHpw+TGSoSFiZFT+nAtKiIiXdWqVUNkZCSio6ORlpaGoUOHat9r0KABjhw5gpMnTyIpKQlvvvkmMjIyDD52WFgYnn32WURFReGXX37BsWPHMHXqVJ19GjRogKtXr2Lbtm3466+/sHz5cuzatUtnn4CAAKSkpCAxMRG3bt1Cbm5uoXMNGjQIDg4OiIqKwm+//Ya4uDiMHTsWr732Gjw9PY37RynGe++9h48++gjbt29HcnIypkyZgsTERIwfPx4AsHjxYmzduhV//PEH/vzzT+zYsQNeXl5wdXXFpk2b8Omnn+K3337D33//jc8//xyOjo7w9/c3WXwFMbmxIuPGAcOGiefVqolkJy4OSElhYkNEVNDw4cNx9+5dhIeH6/SPef/999G6dWuEh4ejc+fO8PLyQu/evQ0+ro2NDXbt2oWHDx+iXbt2eOONN/DBBx/o7NOzZ0+88847GDNmDFq2bImTJ09i2rRpOvv07dsX3bp1Q5cuXeDh4aF3OLqTkxMOHTqEO3fuoG3btujXrx+6du2KlStXGvePUYJx48Zh4sSJePfdd9G8eXMcPHgQe/fuRYMGDQCIkV/z589HmzZt0LZtW1y+fBnffvstbGxs4OrqivXr16NDhw5o0aIFjh49im+++QY1a9Y0aYz5KSRJ38wo1isrKwsuLi7IzMyEc8Hltq1Abq4Y6v3jj8BzzwFHjxpfXUtEVJJHjx4hJSUFdevWhYODg9zhkJUo7ufKmO9v1txYGaUS+PJL8fjdd4CZlx8hIiKqcJjcWKG6dYFJk8Tzd98FHj2SNx4iIqLyxOTGSkVHA7Vri/42RXU0JiIiskZMbqxU1arARx+J53PnisUziYiIKgMmN1bs1VeB9u2B7GxgyhS5oyEia1TJxqSQmZnq54nJjRVTKIBly8Tj558DCQlyR0RE1kIz422OXCtlklXSzNBsW8YZZ7kquJVr00bMfbNhAzB+vBgiXtRMxkREhrK1tYWrq6t2fSInJyftDL9EpaFWq3Hz5k04OTnBzq5s6QnnuakE0tOBZ58F7t8HNm4E8k3ECZUKOHYMSEsTi2qGhnKJBiIyjCRJSE9Pxz1DV+4lKoGNjQ3q1q0Le3v7Qu8Z8/3N5KaSWLgQeO89wNMT+PNPwNkZiIkRtTn//PN0P19f0ZTFGY2JyFAqlcqsiyBS5WFvbw+bIpoXmNwUo7ImN3l5QLNmwMWLwH/+AwQHA/36AQXvvqZWmWtRERFRRcLkphiVNbkBgP37gZdfBqpUAWrUAIpaB06hEDU4KSlsoiIiooqByy+QXi++CHTrBjx+XHRiA4janNRU0ReHiIjI0jC5qUQUCmDJEsNrY9LSzBsPERGROTC5qWQaNQL69DFsX29v88ZCRERkDkxuKqG1a4uf60ahAPz8xLBwIiIiS8PkphKqWRMYOVL/e5rRUkuXsjMxERFZJiY3ldTKlUDduoXLfX05DJyIiCwbk5tKytYW2LxZPFcoxMrhcXFi+DcTGyIismSyJzerVq1CQEAAHBwcEBwcjFOnThW7/7179zB69Gh4e3tDqVTi2WefxbfffltO0VqX0FBgwAAx9PvgQaBTJzZFERGR5ZM1udm+fTsmTpyIGTNm4OzZswgMDER4eLh2IbaC8vLy8Pzzz+Py5cvYuXMnkpOTsX79etSuXbucI7ce8+cDjo7ADz8Ahw7JHQ0REVHZyTpDcXBwMNq2bYuVK1cCECuC+vn5YezYsZgyZUqh/deuXYsFCxbgjz/+QJUqVUp1zso8Q3FR3n0XWLwYaN8eOH78aadiIiKiisIiZijOy8vDmTNnEBYW9jQYGxuEhYUhISFB72f27t2LkJAQjB49Gp6enmjWrBnmzp0LlUpV5Hlyc3ORlZWls5GuSZMApRI4eVL0uyEiIrJksiU3t27dgkqlgqenp065p6cn0tPT9X7m77//xs6dO6FSqfDtt99i2rRpWLRoEf73v/8VeZ558+bBxcVFu/n5+Zn0OqyBtzcwYoR4PmeOvLEQERGVlewdio2hVqtRq1YtrFu3DkFBQYiMjMTUqVOxdu3aIj8THR2NzMxM7ZaamlqOEVuO//xHLKgZHy+apoiIiCyVbMmNu7s7bG1tkVFgBceMjAx4eXnp/Yy3tzeeffZZ2OYb0tO4cWOkp6cjLy9P72eUSiWcnZ11NirMzw8YNkw8Z+0NERFZMtmSG3t7ewQFBSE2NlZbplarERsbi5CQEL2f6dChAy5dugS1Wq0t+/PPP+Ht7Q17e3uzx2ztoqMBOzvg8GGghBH5REREFZaszVITJ07E+vXrsXnzZiQlJWHUqFHIzs7GsP+vQhgyZAiio6O1+48aNQp37tzB+PHj8eeff2L//v2YO3cuRo8eLdclWJWAAOC118Rz1t4QEZGlspPz5JGRkbh58yamT5+O9PR0tGzZEgcPHtR2Mr569Sps8q3w6Ofnh0OHDuGdd95BixYtULt2bYwfPx6TJ0+W6xKszn//K2Yu3rcPOHsWaN1a7oiIiIiMI+s8N3LgPDclGzwY+OILoE8fICZG7miIiIgsZJ4bqrimThUT+e3aBZw/L3c0RERExmFyQ4U0bgz06yeef/CBvLEQEREZi8kN6fX+++Lxq6+AP/54Wq5Siblwtm4Vj8VMDk1ERCQLJjekV4sWQK9eYsXwuXNFWUyMGFHVpQvw6qviMSCA/XKIiKhiYXJDRZo2TTx++SWwerVoqvrnH919rl0T5UxwiIioomByQ0UKCgK6dxdNT++9J2pxCtKUTZjAJioiIqoYmNxQsTS1Nzk5Re8jSUBqKnDsWPnEREREVBwmN1SskBCgaVPD9k1LM28sREREhmByQyV64w3D9vP2Nm8cREREhmByQyUaOxYobl1ShUKsKh4aWn4xERERFYXJDZXI1haYMkX/ewqFeFy6VOxHREQkNyY3ZJCZM4EGDQqX+/oCO3cCERHlHhIREZFeTG7IIAoFsGSJeO7gAKxdC8TFASkpTGyIiKhiYXJDBnvxRaB1a+DRI+DqVaBzZzZFERFRxcPkhgymUDxdc2rVKiArS954iIiI9GFyQ0bp1Qto2BDIzATWrZM7GiIiosKY3JBRbGzEUgyA6IOTmytvPERERAUxuSGjDR4M+PgA168DX3whdzRERES6mNyQ0ZRKsVAmAMyfD6jVsoZDRESkg8kNlcqbbwIuLkByMrB3r9zREBERPcXkhkrF2RkYNUo8/+gjsTI4ERFRRcDkhkpt/HjRRPXjj8Dx43JHQ0REJDC5oVLz8gKiosTzjz6SNxYiIiINJjdUJpMmicn99u8HfvtN7miIiIiY3FAZNWgA9O0rns+fL28sREREAJMbMoHJk8Xj1q1izSkiIiI5MbmhMmvTBnjuOeDJE2DxYrmjISKiyo7JDZmEpvZm/Xrg9m15YyEiosqNyQ2ZxPPPA61aATk5YsVwIiIiuTC5IZNQKID//Ec8X7FCJDkqFRAfL/rixMeL10RERObG5IZMpl8/oG5d4NYtYNw4ICAA6NIFePVV8RgQAMTEyB0lERFZOyY3ZDJ2dmLeGwD49FPgn3903792TSRATHCIiMicmNyQSQ0ZAtgU8VOlWX9qwgQ2URERkfkwuSGT+vlnQK0u+n1JAlJTgWPHyi8mIiKqXJjckEmlpZl2PyIiImMxuSGT8vY27X5ERETGYnJDJhUaCvj6Fv2+QgH4+Yn9iIiIzIHJDZmUrS2wbJlIYgrSlC1dKvYjIiIyByY3ZHIREcDOnYCnp265r68oj4iQJy4iIqocmNyQWUREiHlt2rcXr194AUhJYWJDRETmx+SGzEbTRAUAsbHA5cuyhkNERJUEkxsyqzZtgO7dxaR98+bJHQ0REVUGTG7I7KZNE4+bNwNXrsgbCxERWT8mN2R2ISFAWBjw5Anw0UdyR0NERNaOyQ2VC03tzaefio7GRERE5lIhkptVq1YhICAADg4OCA4OxqlTp4rcd9OmTVAoFDqbg4NDOUZLpdGxo9jy8oD58+WOhoiIrJnsyc327dsxceJEzJgxA2fPnkVgYCDCw8Nx48aNIj/j7OyMtLQ07XaFHTkswvTp4nHdOiA9Xd5YiIjIesme3CxevBgjRozAsGHD0KRJE6xduxZOTk7YsGFDkZ9RKBTw8vLSbp4FZ4ujCum550T/m0ePgIUL5Y6GiIislazJTV5eHs6cOYOwsDBtmY2NDcLCwpCQkFDk5x48eAB/f3/4+fmhV69euHDhQpH75ubmIisrS2cjeSgUT2tv1qwBbt6UNx4iIrJOsiY3t27dgkqlKlTz4unpifQi2i0aNmyIDRs2YM+ePfj888+hVqvRvn17/PPPP3r3nzdvHlxcXLSbn5+fya+DDBceLua+yckBFi+WOxoiIrJGsjdLGSskJARDhgxBy5Yt0alTJ8TExMDDwwMff/yx3v2jo6ORmZmp3VJTU8s5Ysovf+3NypXAnTvyxkNERNZH1uTG3d0dtra2yMjI0CnPyMiAl5eXQceoUqUKWrVqhUuXLul9X6lUwtnZWWcjeb38MtCyJfDggVghnIiIyJRkTW7s7e0RFBSE2NhYbZlarUZsbCxCQkIMOoZKpcL58+fh7e1trjDJxBQK4P33xfPly4F792QNh4iIrIzszVITJ07E+vXrsXnzZiQlJWHUqFHIzs7GsGHDAABDhgxBdHS0dv/Zs2fj8OHD+Pvvv3H27FkMHjwYV65cwRtvvCHXJVAp9OkDNG0KZGYCK1bIHQ0REVkTO7kDiIyMxM2bNzF9+nSkp6ejZcuWOHjwoLaT8dWrV2Fj8zQHu3v3LkaMGIH09HS4ubkhKCgIJ0+eRJMmTeS6BCoFGxtRezNwILBkCTBhAlC9utxRERGRNVBIkiTJHUR5ysrKgouLCzIzM9n/RmYqlai9SU4WK4ZPmSJ3REREVFEZ8/0te7MUVV62tsDUqeL5okVAVhYQHw9s3SoeVSo5oyMiIkvFmhuS1ZMnQKNGwF9/AS4uog+Ohq8vsGwZEBEhX3xERFQxsOaGLIadnZjYD9BNbACxeni/fkBMTPnHRURElovJDclKpQL27NH/nqZOccIENlEREZHhmNyQrI4dEzU0RZEkIDVV7EdERGQIJjckq7Q00+5HRETE5IZkZejE0pyAmoiIDMXkhmQVGipGRSkU+t9XKAA/P7EfERGRIZjckKxsbcVwb6DoBGfpUrEfERGRIZjckOwiIoCdO4HatXXLHR1FOee5ISIiYzC5oQohIgK4fBmIixNLMdjYAA8fAh4eckdGRESWhskNVRi2tkDnzmKNKc0i7xMmAGq1nFEREZGlYXJDFdL//ieWYzh7Fti0Se5oiIjIkjC5oQrJwwOYPl08/+9/xaKaREREhmByQxXWmDHAs88CGRnA3LlyR0NERJaCyQ1VWPb2wKJF4vmSJWLlcCIiopIwuaEK7aWXgBdeAPLygPfekzsaIiKyBExuqEJTKEStja0tsGsX8N13ckdEREQVHZMbqvCaNAFGjRLPJ0wAnjyRNRwiIqrgmNyQRZg5E3BzA86fBz75RO5oiIioImNyQxahZk1g1izxfNo04N49WcMhIqIKjMkNWYy33gIaNwZu3QJmz5Y7GiIiqqiY3JDFqFJFdC4GgBUrgORkeeMhIqKKickNWZTwcDE8/MkT4N135Y6GiIgqIiY3ZHEWLQLs7ID9+4FDh+SOhoiIKhomN2RxGjYUSzMAwPDhwNGjgEolb0xERFRxMLkhixMTA3z1lXh+7Rrw/PNAQIAoJyIiYnJDFiUmBujXD7h+Xbf8n39EORMcIiJickMWQ6UCxo8HJEn/+5IkZjBmExURUeXG5IYsxrFjooamOKmpYj8iIqq8mNyQxUhLM+1+RERknZjckMXw9jZsPy8v88ZBREQVG5MbshihoYCvL6BQFL8fa26IiCo3JjdkMWxtgWXLxPOCCU7+1+PHi/WniIiocmJyQxYlIgLYuROoXVu33NcX2LYNaNZMJDYTJsgSHhERVQAKSSpqYK11ysrKgouLCzIzM+Hs7Cx3OFRKKpUYFZWWJvrihIaKmp1Tp4CQEECtBvbtE+tQERGR5TPm+5vJDVmdSZPE+lN+fsBvvwG8zUREls+Y7282S5HVmT0bqFdPzHkTHS13NEREVN6Y3JDVcXICPvlEPF+9mpP6ERFVNkxuyCp16QKMGCGeDx8OPHwobzxERFR+mNyQ1Zo/H/DxAS5eFE1VRERUOTC5Iavl6iqapQBgwQLg7FlZwyEionJSquQmNTUV/+RbwfDUqVOYMGEC1q1bZ7LAiEyhVy/glVfE0PHhw4HHj+WOiIiIzK1Uyc2rr76KuLg4AEB6ejqef/55nDp1ClOnTsVs1v9TBbN8OVCjBpCYKGpwiIjIupUqufntt9/Qrl07AMBXX32FZs2a4eTJk/jiiy+wadMmU8ZHVGaensDSpeL5jBnADz/IGg4REZlZqZKbx48fQ6lUAgCOHj2Knj17AgAaNWqEtFKsWrhq1SoEBATAwcEBwcHBOHXqlEGf27ZtGxQKBXr37m30OalyGTwYGDAAePIE6NcPuHpV7oiIiMhcSpXcNG3aFGvXrsWxY8dw5MgRdOvWDQBw/fp11KxZ06hjbd++HRMnTsSMGTNw9uxZBAYGIjw8HDdu3Cj2c5cvX8akSZMQGhpamkugSkatBqKiAH9/4OZNoE8fDg8nIrJWpUpuPvroI3z88cfo3LkzBg4ciMDAQADA3r17tc1Vhlq8eDFGjBiBYcOGoUmTJli7di2cnJywYcOGIj+jUqkwaNAgzJo1C/Xq1SvNJVAlEhMDBAQA3bsDV66IsrNngW7dgMq1+AgRUeVgV5oPde7cGbdu3UJWVhbc3Ny05SNHjoSTk5PBx8nLy8OZM2cQnW+OfBsbG4SFhSEhIaHIz82ePRu1atXC8OHDcayE6Wdzc3ORm5urfZ2VlWVwfGT5YmJEM5S+JOaHH4BhwwB2EyMisi6lqrl5+PAhcnNztYnNlStXsHTpUiQnJ6NWrVoGH+fWrVtQqVTw9PTUKff09ER6errezxw/fhyffvop1q9fb9A55s2bBxcXF+3m5+dncHxk2VQqYPz44mtnNm8GDh0qv5iIiMj8SpXc9OrVC5999hkA4N69ewgODsaiRYvQu3dvrFmzxqQB5nf//n289tprWL9+Pdzd3Q36THR0NDIzM7Vbamqq2eKjiuXYMSDfdExFeuUV4O+/zR8PERGVj1IlN2fPntV25N25cyc8PT1x5coVfPbZZ1i+fLnBx3F3d4etrS0yMjJ0yjMyMuDl5VVo/7/++guXL19Gjx49YGdnBzs7O3z22WfYu3cv7Ozs8NdffxX6jFKphLOzs85GlYOhA/eysoDevYEHD8waDhERlZNSJTc5OTmoXr06AODw4cOIiIiAjY0N/vWvf+GKpsemAezt7REUFITY2FhtmVqtRmxsLEJCQgrt36hRI5w/fx6JiYnarWfPnujSpQsSExPZ5EQ6vL0N269GDeD8edH/hh2MiYgsX6mSm2eeeQa7d+9GamoqDh06hBdeeAEAcOPGDaNrRiZOnIj169dj8+bNSEpKwqhRo5CdnY1hw4YBAIYMGaLtcOzg4IBmzZrpbK6urqhevTqaNWsGe3v70lwOWanQUMDXF1Ao9L+vUAB+fsDu3UCVKsDOncC8eeUaIhERmUGpkpvp06dj0qRJCAgIQLt27bS1LIcPH0arVq2MOlZkZCQWLlyI6dOno2XLlkhMTMTBgwe1nYyvXr1aqokBiWxtgWXLxPOCCY7m9dKlIglatUq8fv99YP/+cguRiIjMQCFJpauIT09PR1paGgIDA2FjI3KkU6dOwdnZGY0aNTJpkKaUlZUFFxcXZGZmsv9NJRETI0ZN5e9c7OcnEpuIiKdlb78NrFkDODsDp04BDRuWe6hERFQEY76/S53caGhWB/f19S3LYcoNk5vKSaUSo6fS0kRfnNBQUbOTX14e0LUrcPy4SGx++glwcZEnXiIi0mXM93epmqXUajVmz54NFxcX+Pv7w9/fH66urpgzZw7UanWpgiYyJ1tboHNnYOBA8VgwsQEAe3vR78bXF0hOFutR8ceZiMjylCq5mTp1KlauXIkPP/wQ586dw7lz5zB37lysWLEC06ZNM3WMROXG0xPYtQtQKoF9+4AxY5jgEBFZmlI1S/n4+GDt2rXa1cA19uzZg7fffhvXrl0zWYCmxmYpMsTWrcCgQWJo+JtvAqtXAzal+lOAiIhMwezNUnfu3NHbabhRo0a4c+dOaQ5JVKEMHCjWnFIogI8/FgkOa3CIiCxDqZKbwMBArFy5slD5ypUr0aJFizIHRVQRDBkCbNkiamw++QR44w3RMZmIiCq2Uq0KPn/+fLz00ks4evSodo6bhIQEpKam4ttvvzVpgERyGjRIdD4ePBjYuFEkNxs26O+QTEREFUOpam46deqEP//8E3369MG9e/dw7949RERE4MKFC9iyZYupYySS1YABog+OrS3w2WdAVBTw5IncURERUVHKPM9Nfr/88gtat24NVQWuu2eHYiqtr78Wic6TJ+JxyxbArlR1n0REZCyzdygmqoz69gV27BDrUG3bBrz6KvD4sdxRERFRQUxuiApQqYD4eNEUFR+v24m4d29Rg1Olikh0Bg5kgkNEVNEwuSHKJyYGCAgAunQRNTNduojXMTFP9+nRQ0z0Z28vEp1XXhFLNxARUcVgVI+BiPyrDOpx7969ssRCJKuYGKBfPzFxX37XronynTufLrT50kvAnj2iJmf3bvH+jh1iZmMiIpKXUR2Khw0bZtB+GzduLHVA5sYOxaSPSiVqaPKvHJ6fQiHWnEpJ0R0Gfvgw0KsX8OgR0K2b6IvDxTaJiEyvXFcFtzRMbkif+HjRBFWSuDix8GZ+R48CPXsCDx8CDRqIGqBmzcwRJRFR5cXRUkRGSksr/X5hYcAPPwB16gAXLwLBwaIzMhERyYPJDREAb++y7demDXDmDPD880BOjuiMPH48OxoTEcmByQ0RgNBQ0adGodD/vkIB+PmJ/Yri7g4cOABMnSpeL18umrquXzd9vEREVDQmN0QQnYSXLRPPCyY4mtdLl5a8ppStLfC//wF794qOxSdPAq1bA99/b/KQiYioCExuiP5fRIQY7l27tm65r6/uMHBD9OgB/Pwz0Lw5kJEBdO0KLFpUeJg5ERGZHkdLERWgUgHHjonOw97eoimqtKuA5+QAb74JfP65eN2vn1hVvHp108VLRFQZcCh4MZjcUHmTJGD1auCdd8RSDY0aieHijRvLHRkRkeXgUHCiCkShAEaPFv1ufHyAP/4A2rUDNm5kMxURkTkwuSEqJyEhwNmzYhLABw+A118XfXH+/FPuyIiIrAuTG6Jy5OkJHDkCfPQR4OgoZjxu0QKYM4dz4hARmQqTG6IyUqnE8g1bt4pHlar4/e3sgP/8B7hwAQgPB3JzgenTgZYtgePHyyFgIiIrx+SGqAxiYsSCm126iFmJu3QRr2NiSv5s3bpi0r8vvwRq1QKSksTIrDffBO7eNXfkRETWi8kNUSnFxIih3QVXEr92TZQbkuAoFMDAgSKxeeMNUbZunRhJtX07OxwTEZUGkxuiUlCpxNpR+pIPTdmECSU3UWnUqAGsXy9GVDVqJCb+GzAAePll4PJlU0VNRFQ5MLkhKoVjxwrX2OQnSUBqqtjPGB07AomJwKxZgL098O23QNOmwIIFwMOHZQqZiKjSYHJDVAppaabdLz+lUnQw/vVXoFMnMcvxf/4j+ugsWgRkZxt/TCKiyoTJDVEpeHubdj99GjYUQ8U3bRKdlDMygEmTxPMPPwTu3y/9sYmIrBmTG6JSCA0VC2oWXEFcQ6EA/PzEfmWhUABRUWKivw0bgPr1gVu3gOhokeTMmQPcu1e2cxARWRsmN0SlYGsLLFsmnhdMcDSvly4t/YKbBVWpAgwbJpZu2LJF1OrcuSOar/z9xeOdO6Y5FxGRpWNyQ1RKERHAzp1A7dq65b6+ojwiwvTntLMDBg8WEwBu3So6G2dliRocf39Ro3PzpunPS0RkSbgqOFEZqVRiVFRamuhjExpquhqbkqjVwK5dIrn55RdR5uQk5swZN040YxERWQNjvr+Z3BBZAUkCvvkGmD0bOHNGlCkUQM+ewDvviCHmRfUPIiKyBMZ8f7NZisgKaBKZ06eBQ4eA7t1FwrNnj1iFvHVrYPNmsY4VEZG1Y3JDZEUUCuCFF8Tkf7//Drz1llh9PDERGDpU9MuZPRu4cUPuSImIzIfNUkTlrLz76Ny+LZZ2WLlSrHsFiIkCBw0SS0i0aGG+cxMRmQr73BSDyQ3JKSZGJBT5l27w9RXDys0xuiq/x4/FKK4lS0TzlUbnzmJF8z59AHd388ZARNbn0SMxSvPmTTEP182bgLMz0KOHac/D5KYYTG5ILppVxAv+xmk6+ppr+HhBkgQkJIh5eL7+Woy4AkTtUZcuIsY+fYBatcwfCxFVTHl5oqb36lWxXb+um7zkT2YePCj8+Q4dgOPHTRsTk5tiMLkhOahUYkbhohbbVChEDU5KSvkNIweAK1eAL74QidW5c0/LbWzEulb9+4tEx8ur/GIiIvO7cwe4fPlp8pKa+vT51aui2dyY7KBKFVHz6+EhtsBAsRaeKTG5KQaTG5JDfLyoFSlJXJxoJpLDpUuiJmfHjqfDyQGReHXsKGp0+vYt23pZRFT+VCoxwODkSbGdOAH89VfJn1MqxTIydeqIyUpr1dJNYPJvzs7mn26CyU0xmNyQHLZuFf1aSvLll8DAgeaPpyQpKaI2Z8cO3f45CgXwr38BL78stubNOX8OUUVz/z7w009Pk5mEBDGTeUFeXiJx0SQwBTcPj4r1+21xyc2qVauwYMECpKenIzAwECtWrEC7du307hsTE4O5c+fi0qVLePz4MRo0aIB3330Xr732mkHnYnJDcrCEmpuiXLkiEp2dO4Eff9R9z88PeOklkeg895wYdk5E5efxYyApSTQrnzolkplff33al06jalXxh0n79qI/THAw4OoqS8ilZlHJzfbt2zFkyBCsXbsWwcHBWLp0KXbs2IHk5GTU0tOjMT4+Hnfv3kWjRo1gb2+Pffv24d1338X+/fsRHh5e4vmY3JAcNH1url3T344tV58bY/3zD7B/P7BvH3D0qBgloeHoKBKcl18WCY+fn3xxElmjBw9E4nLu3NPtt99E59+C/P1FEtO+vdiaNxdr01kyi0pugoOD0bZtW6xcuRIAoFar4efnh7Fjx2LKlCkGHaN169Z46aWXMGfOnBL3ZXJDctGMlgJ0E5zyHi1lKg8fipqmffvElpqq+35goJgpuV07oFUr8Z9tRariJqpoJEk0Kd25A9y9C6SnizXjEhNFInPxov4/jqpXB1q2BIKCREITElJ4QV9rYDHJTV5eHpycnLBz50707t1bWx4VFYV79+5hz549xX5ekiR899136NmzJ3bv3o3nn3++0D65ubnIzTfnfFZWFvz8/JjckCz0zXPj5yeGZVtSYlOQJIm/IDWJTkJC4f+E3dzEf8CtW4tkp1UroGHDil1TRVRWOTliVFJKitgyMkTioklgCj5XqYo/no+P+D1q1erpY926YoSjtTMmuZG1kurWrVtQqVTw9PTUKff09MQff/xR5OcyMzNRu3Zt5ObmwtbWFqtXr9ab2ADAvHnzMGvWLJPGTVRaERFAr17yrSJuLgqFqPZu3hyIjhZzXxw8CHz3nfiL88IF8R93XJzYNBwdxQzJmmSndWtxDKVSvmshMsbjx2LotCZ5KbiVZqkTpRKoUQOoWRNo2vRpItOyJVDg65KKYJEtcNWrV0diYiIePHiA2NhYTJw4EfXq1UNnPT0xo6OjMXHiRO1rTc0NkVxsbQ3vNFzeSzWYirs7MHiw2ACxYOfvv+v2FUhMBLKzxaiOn356+tkqVYBmzUQVu2Zr0YIJD8nrzh3gjz+ebklJ4jElpeTaFhcXUbtSt674Pa5RQ9RkFvXIjvllJ2ty4+7uDltbW2RkZOiUZ2RkwKuYWcNsbGzwzDPPAABatmyJpKQkzJs3T29yo1QqoeT/imSB5FyqwdSUyqe1MxpqtZhbR5PsnD0rttu3n5Z98onY185O1Ogw4SFzys0Vv28XLz5NXjSJzM2bRX/OwUEMGNAkMAU3N7dyuwT6f7ImN/b29ggKCkJsbKy2z41arUZsbCzGjBlj8HHUarVOvxoiS1fUUg3XrolyS+t8rI+NDfDss2KLjBRlkiSq+M+cAX7+WTyeOaM/4VEoACcn8cVS3OboKB69vZ8Og/XwkO+6SR45OeL3559/ROf3f/4pvBWXwACif1yjRmJr3Fg8Nmwo5oupDH1eLInszVITJ05EVFQU2rRpg3bt2mHp0qXIzs7GsGHDAABDhgxB7dq1MW/ePACiD02bNm1Qv3595Obm4ttvv8WWLVuwZs0aOS+DyGRUKlFjo6+rvySJL/UJE0TfHUtoojKGQiFGVfn7P03e8ic8mu3nn0XCk50tNmM1bCiSnH//W2zPPMORXBVdbu7TtY6uXQMyM8XQaM3PgOa5vjJNh11DODgA9evrJjCaJKZaNfNeI5mO7MlNZGQkbt68ienTpyM9PR0tW7bEwYMHtZ2Mr169Cpt8KXF2djbefvtt/PPPP3B0dESjRo3w+eefI1Lzpx+RhTt2rOg1qADxZZ+aKvaraBP+mUNRCc/Nm+KL69EjMSz90SPdLX/Zw4eiqeH4cdH3JzlZbBs2iOPVqvU02enQQTSf2dvLd82ViVotEpe7d5+ucaRZ5yj/8wK9F0qlalVR++LrW/RWowYTXWsg+zw35Y3z3FBFZ2lLNViaO3fELK7Hj4s1dk6dKjwJmoODGHJbo8bTUSsFn+cvq1pVHCMvT3xRl/TcxUU0k3l7iyYNS+s79OSJqDm7dUv/dvOm+HfWJJi5uWLT9/zxY8PP6+AgkhM/P9GPpWpVUZtStaru84JlLi4icSmP9Y/IfCxmKDgRFWbowpRcwLJ0atR4ujYWIL5gz5wRyY4m4blzB/j7b7GVV0xeXk8TnvyJj5ubSBJycp42txTc8r/3+LGo2VKr9T8WfF4UfUlAdrZIXu7dM/2/ga2tmHhOk7xo1jzK/7pmTSYnZBjW3BBVMNayVIOlUqufzk9y+7ZIdDSP+Z/nL8vJEbUv9vZiK+65nZ1ogklLEzPQ6ps631LUqCE6Z7u7F940NVpKpahxyf+or8zJiT/PVDzW3BBZMFtbMdy7Xz+RyOhbqmHpUn4RmIuNjehQWr+++c8lSU8THX1berqoJXFyEpumqaW4rUoVcQ0KxdPH/M8LPhaMp7jXDg5Pkxk3N8tfq4isF380iSqgiAgx3FvfPDeWvlQDPaVQPO2307Sp3NEQWQ8mN0QVVGmWarDUGY2JiEyJyQ1RBWbMUg3WNKMxEVFZcE5FIiugmdG44Pw4mhmNY2LkiYuISA5MbogsXEkzGgNiRuOSFvcjIrIWTG6ILJwxMxoTEVUGTG6ILFxammn3IyKydExuiCwcZzQmItLF5IbIwoWGilFRRU1Lr1CI6etDQ8s3LiIiuTC5IbJwmhmNgcIJDmc0JqLKiMkNkRXQzGhcu7Zuua+vKNc3z41KBcTHi1XI4+M5moqIrAcn8SOyEsbMaMwJ/4jImnFVcKJKRjPhX8HffE0TVlE1PUREcjLm+5vNUkSVCCf8I6LKgMkNUSXCCf+IqDJgckNUiXDCPyKqDJjcEFUinPCPiCoDJjdElQgn/COiyoDJDVElUpYJ/zgvDhFZCiY3RJVMaSb8i4kBAgKALl2AV18VjwEBopyIqKLhPDdElZRKZfiEf5wXh4jkZsz3N5MbIiqSSiVqaIoaPq5QiBqflBSuXUVE5sVJ/IjIJDgvDhFZIiY3RFQkzotDRJaIyQ0RFYnz4hCRJeKq4ERUJM28ONeu6V+PStPnpuC8OIZ2ViYiMgfW3BBRkUozLw6HjROR3JjcEFGxjJkXRzNsvGAn5GvXRDkTHCIqDxwKTkQGKampicPGicicjPn+Zp8bIjKIrS3QuXPR7xszbLy44xARlRWbpYjIJDhsnIgqCtbcEJFJlGXYOEdXEZEpseaGiExCM2y84KgqDYUC8PMrPGyco6uIyNSY3BCRSZR22DhHVxGRqTG5ISKTMWbYuEoFjB+vf3JATdmECWI/IiJjsM8NEZlURATQq1fJfWg4uoqIzIXJDRGZXEnDxgGOriIi82FyQ0SyKO3oKo6sIqKSsM8NEcmiNKOrOLKKiAzB5IaIZGHs6CqOrCIiQzG5ISLZGDq6iiOriMgY7HNDRLIyZHQVR1YRkTEqRM3NqlWrEBAQAAcHBwQHB+PUqVNF7rt+/XqEhobCzc0Nbm5uCAsLK3Z/Iqr4NKOrBg4UjwU7CHNkFREZQ/bkZvv27Zg4cSJmzJiBs2fPIjAwEOHh4bhx44be/ePj4zFw4EDExcUhISEBfn5+eOGFF3Dt2rVyjpyIyktZ162Kjwe2bhWPbLoisn4KSdLXil1+goOD0bZtW6xcuRIAoFar4efnh7Fjx2LKlCklfl6lUsHNzQ0rV67EkCFDStw/KysLLi4uyMzMhLOzc5njJyLzU6nEqKhr1/T3u1EoRD+dlJTCyzuMH6/bpOXrKzoy558tmYgqPmO+v2WtucnLy8OZM2cQFhamLbOxsUFYWBgSEhIMOkZOTg4eP36MGjVq6H0/NzcXWVlZOhsRWRauW0VExpA1ubl16xZUKhU8PT11yj09PZGenm7QMSZPngwfHx+dBCm/efPmwcXFRbv5+fmVOW4iKn9ct4qIDCV7n5uy+PDDD7Ft2zbs2rULDg4OeveJjo5GZmamdktNTS3nKInIVCIigMuXgbg44MsvxWNKSuEmJmNGVxGR9ZF1KLi7uztsbW2RkZGhU56RkQEvL69iP7tw4UJ8+OGHOHr0KFq0aFHkfkqlEkql0iTxEpH8zL1uFZd3ILJ8stbc2NvbIygoCLGxsdoytVqN2NhYhISEFPm5+fPnY86cOTh48CDatGlTHqESkQUp7egqLu9AZB1kb5aaOHEi1q9fj82bNyMpKQmjRo1CdnY2hg0bBgAYMmQIoqOjtft/9NFHmDZtGjZs2ICAgACkp6cjPT0dDx48kOsSiKiCKe26VeyATGQdZE9uIiMjsXDhQkyfPh0tW7ZEYmIiDh48qO1kfPXqVaTlqztes2YN8vLy0K9fP3h7e2u3hQsXynUJRFTBGDu6ih2QiayL7PPclDfOc0NUeeib58bPTyQ2+Tshx8eLJqiSxMXp9vdh/xyi8mPM9zfXliIiq2XIulVA6Togc4JAooqLyQ0RWTVDRlcZ2wFZ0z+nYL23pn9OwXl3iKh8yd7nhohIbsZ0QGb/HKKKj8kNEVV6xnRA5gSBRBUfkxsiIhi+vENZJwjkCuVE5sc+N0RE/8+QDshlmSCQHZCJygeHghMRGUGlErMWX7umv9+NQiGSlpSUp0lRUR2QNU1e7IBMVDJjvr/ZLEVEZAROEEhU8TG5ISIykqH9c4DSd0Bm/xyi0mOfGyKiUuAEgUQVF5MbIqJS4gSBRBUTm6WIiMyIEwQSlT8mN0REZlReEwSyjw7RU0xuiIjMzNwTBMbEiOHpXboAr74qHgMCRDlRZcQ+N0RE5cBcEwSyjw5RYZzEj4iogjB2gkDN/kU1ZembUFBznpJGeRFVNJzEj4jIAhk7QWBp+uiwCYsqAyY3REQViDETBBrbR0fThFUwIdI0YTHBIWvBPjdERBWMoRMEGtNHp6Rh5gqFGGbeqxebqMjyMbkhIqqADJkgUDOHTkl9dEJDjWvCKnhe9tEhS8NmKSIiC2VMHx0OM6fKhMkNEZEFM7SPTlmGmbOPDlkaDgUnIrICJTUdldcwc0NiISoNY76/2eeGiMgKlNRHR9OE1a+fSEzyJzhlHWae/7xc0ZwqAjZLERFVEuYcZg6wGYsqDtbcEBFVIuYYZg6Ufqg5m7DIHJjcEBFVMqYeZg6UrhmLTVhkLmyWIiKiQoxdCoKzJVNFwuSGiIj0MqaPjilnSwZEE5ZKVfh9lQqIjwe2bhWP+vYh4lBwIiIqliH9YowZan7smJgMsCRxcRyJRU9xKDgREZmMIX10jBlqXpaRWAUTJ00zVsGaJKrc2CxFREQmYa7ZkkvbjMUmrMqLzVJERGRSpp4tOT7e+GYsNmFZHzZLERGRbEw9W3JpR2KxCavyYrMUERGVO47EInNisxQREcmGI7HIUGyWIiIii2CpI7G4bETFxmYpIiKq8CrSSKyYGFGT1KUL8Oqr4jEggLMqVyRsliIiIosh90isomp5NDVI7KxsPmyWIiIiqyTnSKzSrnwOsBmrvLFZioiIrIq5RmIZs/J5fmzGKn+suSEiIqsTESFqUEqqLQkNFUlPSc1YoaHAV18Zdm52VpYfa26IiMgqaZqwBg4Uj/oSBE0zFvC02UqjYDMWOytbDiY3RERUqRnajKWp5SmYBGkoFICfn9gPML4ZS1PLU/AzmlqeohIcTj5YmOzJzapVqxAQEAAHBwcEBwfj1KlTRe574cIF9O3bFwEBAVAoFFi6dGn5BUpERFYrIgK4fFmMivryS/GYkqLbZGRMLQ9g2s7KgP6ZlVnTo5+syc327dsxceJEzJgxA2fPnkVgYCDCw8Nx48YNvfvn5OSgXr16+PDDD+Hl5VXO0RIRkTUzpBmrInVWZk1P0WSd5yY4OBht27bFypUrAQBqtRp+fn4YO3YspkyZUuxnAwICMGHCBEyYMMGoc3KeGyIiKitTLxvx1Vei5qUkX34pki/NsYtKiArO56NhyctMGPP9LVvNTV5eHs6cOYOwsLCnwdjYICwsDAkJCXKFRUREVCK5OyuXV02PpdbyyJbc3Lp1CyqVCp6enjrlnp6eSE9PN9l5cnNzkZWVpbMRERGVB3N1VjZ2Da3KNnJL9g7F5jZv3jy4uLhoNz8/P7lDIiKiSsQcnZXNXdNj6f15ZEtu3N3dYWtri4yMDJ3yjIwMk3YWjo6ORmZmpnZLTU012bGJiIgMYerOyuas6bGGkVuyJTf29vYICgpCbGystkytViM2NhYhISEmO49SqYSzs7PORkREVBEZUssDmLempzxHbpmLrM1SEydOxPr167F582YkJSVh1KhRyM7OxrBhwwAAQ4YMQXR0tHb/vLw8JCYmIjExEXl5ebh27RoSExNx6dIluS6BiIjIpAyp5QHMV9NTHv15zE3WtaUiIyNx8+ZNTJ8+Henp6WjZsiUOHjyo7WR89epV2Ng8zb+uX7+OVq1aaV8vXLgQCxcuRKdOnRAfH1/e4RMREcnK0DW0jFkt3Zz9eYpb0d2UZJ3nRg6c54aIiCorffPc+PmJxEZT02PM/Dy2tqLzsDFz9JSWMd/fXBWciIiokjCkpseYWh7A+Jqe8sCaGyIiIirEkFoewPiantJizQ0RERGViTn685QXJjdERESkl2bkVkk0I7f0rVtVsKanPDC5ISIiojIztKanPDC5ISIiIpMwtKbH3Kx+bSkiIiKqXJjcEBERkVVhckNERERWhckNERERWRUmN0RERGRVmNwQERGRVWFyQ0RERFaFyQ0RERFZFSY3REREZFUq3QzFmkXQs7KyZI6EiIiIDKX53pb0LT1eQKVLbu7fvw8A8PPzkzkSIiIiMtb9+/fh4uJS7D4KyZAUyIqo1Wpcv34d1atXh0KzFnsRsrKy4Ofnh9TUVDg7O5dThOWP12ldKsN1VoZrBHid1obXWTaSJOH+/fvw8fGBjU3xvWoqXc2NjY0NfH19jfqMs7OzVf8gavA6rUtluM7KcI0Ar9Pa8DpLr6QaGw12KCYiIiKrwuSGiIiIrAqTm2IolUrMmDEDSqVS7lDMitdpXSrDdVaGawR4ndaG11l+Kl2HYiIiIrJurLkhIiIiq8LkhoiIiKwKkxsiIiKyKkxuiIiIyKowuSnGqlWrEBAQAAcHBwQHB+PUqVNyh2RSM2fOhEKh0NkaNWokd1hl9sMPP6BHjx7w8fGBQqHA7t27dd6XJAnTp0+Ht7c3HB0dERYWhosXL8oTbCmVdI1Dhw4tdG+7desmT7BlMG/ePLRt2xbVq1dHrVq10Lt3byQnJ+vs8+jRI4wePRo1a9ZEtWrV0LdvX2RkZMgUcekYcp2dO3cudE/feustmSI23po1a9CiRQvtxG4hISE4cOCA9n1ruI9Ayddp6fexKB9++CEUCgUmTJigLZPznjK5KcL27dsxceJEzJgxA2fPnkVgYCDCw8Nx48YNuUMzqaZNmyItLU27HT9+XO6Qyiw7OxuBgYFYtWqV3vfnz5+P5cuXY+3atfjpp59QtWpVhIeH49GjR+UcaemVdI0A0K1bN517u3Xr1nKM0DS+//57jB49Gj/++COOHDmCx48f44UXXkB2drZ2n3feeQfffPMNduzYge+//x7Xr19HRESEjFEbz5DrBIARI0bo3NP58+fLFLHxfH198eGHH+LMmTP4+eef8dxzz6FXr164cOECAOu4j0DJ1wlY9n3U5/Tp0/j444/RokULnXJZ76lEerVr104aPXq09rVKpZJ8fHykefPmyRiVac2YMUMKDAyUOwyzAiDt2rVL+1qtVkteXl7SggULtGX37t2TlEqltHXrVhkiLLuC1yhJkhQVFSX16tVLlnjM6caNGxIA6fvvv5ckSdy7KlWqSDt27NDuk5SUJAGQEhIS5AqzzApepyRJUqdOnaTx48fLF5QZuLm5SZ988onV3kcNzXVKkvXdx/v370sNGjSQjhw5onNtct9T1tzokZeXhzNnziAsLExbZmNjg7CwMCQkJMgYmeldvHgRPj4+qFevHgYNGoSrV6/KHZJZpaSkID09Xefeuri4IDg42OrubXx8PGrVqoWGDRti1KhRuH37ttwhlVlmZiYAoEaNGgCAM2fO4PHjxzr3s1GjRqhTp45F38+C16nxxRdfwN3dHc2aNUN0dDRycnLkCK/MVCoVtm3bhuzsbISEhFjtfSx4nRrWch8BYPTo0XjppZd07h0g/+9mpVs40xC3bt2CSqWCp6enTrmnpyf++OMPmaIyveDgYGzatAkNGzZEWloaZs2ahdDQUPz222+oXr263OGZRXp6OgDovbea96xBt27dEBERgbp16+Kvv/7Cf//7X3Tv3h0JCQmwtbWVO7xSUavVmDBhAjp06IBmzZoBEPfT3t4erq6uOvta8v3Ud50A8Oqrr8Lf3x8+Pj749ddfMXnyZCQnJyMmJkbGaI1z/vx5hISE4NGjR6hWrRp27dqFJk2aIDEx0aruY1HXCVjHfdTYtm0bzp49i9OnTxd6T+7fTSY3lVj37t21z1u0aIHg4GD4+/vjq6++wvDhw2WMjMpqwIAB2ufNmzdHixYtUL9+fcTHx6Nr164yRlZ6o0ePxm+//WYV/cKKU9R1jhw5Uvu8efPm8Pb2RteuXfHXX3+hfv365R1mqTRs2BCJiYnIzMzEzp07ERUVhe+//17usEyuqOts0qSJVdxHAEhNTcX48eNx5MgRODg4yB1OIWyW0sPd3R22traFenVnZGTAy8tLpqjMz9XVFc8++ywuXbokdyhmo7l/le3e1qtXD+7u7hZ7b8eMGYN9+/YhLi4Ovr6+2nIvLy/k5eXh3r17Ovtb6v0s6jr1CQ4OBgCLuqf29vZ45plnEBQUhHnz5iEwMBDLli2zuvtY1HXqY4n3ERDNTjdu3EDr1q1hZ2cHOzs7fP/991i+fDns7Ozg6ekp6z1lcqOHvb09goKCEBsbqy1Tq9WIjY3VaTe1Ng8ePMBff/0Fb29vuUMxm7p168LLy0vn3mZlZeGnn36y6nv7zz//4Pbt2xZ3byVJwpgxY7Br1y589913qFu3rs77QUFBqFKlis79TE5OxtWrVy3qfpZ0nfokJiYCgMXd0/zUajVyc3Ot5j4WRXOd+ljqfezatSvOnz+PxMRE7damTRsMGjRI+1zWe2r2LssWatu2bZJSqZQ2bdok/f7779LIkSMlV1dXKT09Xe7QTObdd9+V4uPjpZSUFOnEiRNSWFiY5O7uLt24cUPu0Mrk/v370rlz56Rz585JAKTFixdL586dk65cuSJJkiR9+OGHkqurq7Rnzx7p119/lXr16iXVrVtXevjwocyRG664a7x//740adIkKSEhQUpJSZGOHj0qtW7dWmrQoIH06NEjuUM3yqhRoyQXFxcpPj5eSktL0245OTnafd566y2pTp060nfffSf9/PPPUkhIiBQSEiJj1MYr6TovXbokzZ49W/r555+llJQUac+ePVK9evWkjh07yhy54aZMmSJ9//33UkpKivTrr79KU6ZMkRQKhXT48GFJkqzjPkpS8ddpDfexOAVHgsl5T5ncFGPFihVSnTp1JHt7e6ldu3bSjz/+KHdIJhUZGSl5e3tL9vb2Uu3ataXIyEjp0qVLcodVZnFxcRKAQltUVJQkSWI4+LRp0yRPT09JqVRKXbt2lZKTk+UN2kjFXWNOTo70wgsvSB4eHlKVKlUkf39/acSIERaZmOu7RgDSxo0btfs8fPhQevvttyU3NzfJyclJ6tOnj5SWliZf0KVQ0nVevXpV6tixo1SjRg1JqVRKzzzzjPTee+9JmZmZ8gZuhNdff13y9/eX7O3tJQ8PD6lr167axEaSrOM+SlLx12kN97E4BZMbOe+pQpIkyfz1Q0RERETlg31uiIiIyKowuSEiIiKrwuSGiIiIrAqTGyIiIrIqTG6IiIjIqjC5ISIiIqvC5IaIiIisCpMbIqqUFAoFdu/eLXcYRGQGTG6IqNwNHToUCoWi0NatWze5QyMiK2AndwBEVDl169YNGzdu1ClTKpUyRUNE1oQ1N0QkC6VSCS8vL53Nzc0NgGgyWrNmDbp37w5HR0fUq1cPO3fu1Pn8+fPn8dxzz8HR0RE1a9bEyJEj8eDBA519NmzYgKZNm0KpVMLb2xtjxozRef/WrVvo06cPnJyc0KBBA+zdu1f73t27dzFo0CB4eHjA0dERDRo0KJSMEVHFxOSGiCqkadOmoW/fvvjll18waNAgDBgwAElJSQCA7OxshIeHw83NDadPn8aOHTtw9OhRneRlzZo1GD16NEaOHInz589j7969eOaZZ3TOMWvWLLzyyiv49ddf8eKLL2LQoEG4c+eO9vy///47Dhw4gKSkJKxZswbu7u7l9w9ARKVXLstzEhHlExUVJdna2kpVq1bV2T744ANJksQq2W+99ZbOZ4KDg6VRo0ZJkiRJ69atk9zc3KQHDx5o39+/f79kY2OjXf3cx8dHmjp1apExAJDef/997esHDx5IAKQDBw5IkiRJPXr0kIYNG2aaCyaicsU+N0Qkiy5dumDNmjU6ZTVq1NA+DwkJ0XkvJCQEiYmJAICkpCQEBgaiatWq2vc7dOgAtVqN5ORkKBQKXL9+HV27di02hhYtWmifV61aFc7Ozrhx4wYAYNSoUejbty/Onj2LF154Ab1790b79u1Lda1EVL6Y3BCRLKpWrVqomchUHB0dDdqvSpUqOq8VCgXUajUAoHv37rhy5Qq+/fZbHDlyBF27dsXo0aOxcOFCk8dLRKbFPjdEVCH9+OOPhV43btwYANC4cWP88ssvyM7O1r5/4sQJ2NjYoGHDhqhevToCAgIQGxtbphg8PDwQFRWFzz//HEuXLsW6devKdDwiKh+suSEiWeTm5iI9PV2nzM7OTttpd8eOHWjTpg3+/e9/44svvsCpU6fw6aefAgAGDRqEGTNmICoqCjNnzsTNmzcxduxYvPbaa/D09AQAzJw5E2+99RZq1aqF7t274/79+zhx4gTGjh1rUHzTp09HUFAQmjZtitzcXOzbt0+bXBFRxcbkhohkcfDgQXh7e+uUNWzYEH/88QcAMZJp27ZtePvtt+Ht7Y2tW7eiSZMmAAAnJyccOnQI48ePR9u2beHk5IS+ffti8eLF2mNFRUXh0aNHWLJkCSZNmgR3d3f069fP4Pjs7e0RHR2Ny5cvw9HREaGhodi2bZsJrpyIzE0hSZIkdxBERPkpFArs2rULvXv3ljsUIrJA7HNDREREVoXJDREREVkV9rkhogqHreVEVBasuSEiIiKrwuSGiIiIrAqTGyIiIrIqTG6IiIjIqjC5ISIiIqvC5IaIiIisCpMbIiIisipMboiIiMiqMLkhIiIiq/J/LUHSIGcnD8UAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "acc = history_dict['accuracy']\n",
    "val_acc = history_dict['val_accuracy']\n",
    "loss = history_dict['loss']\n",
    "val_loss = history_dict['val_loss']\n",
    "\n",
    "epochs = range(1, len(acc) + 1)\n",
    "\n",
    "# “bo”代表 \"蓝点\"\n",
    "plt.plot(epochs, loss, 'bo', label='Training loss')\n",
    "# b代表“蓝色实线”\n",
    "plt.plot(epochs, val_loss, 'b', label='Validation loss')\n",
    "plt.title('Training and validation loss')\n",
    "plt.xlabel('Epochs')\n",
    "plt.ylabel('Loss')\n",
    "plt.legend()\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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IdebR0ZGol27dvjss88AAGq1GoGBgXj77bcxadKkUvVXrFiBBQsW4Ny5c7C3t6/Ue+bm5sLDwwM5OTlwd3evUvxERERkGcb8fsvWLfXw4UMcPXoUXbt2LQrGxgZdu3bFgQMH9O6zbds2dOjQAaNHj4aPjw9atmyJOXPmQKVSlfk+BQUFyM3N1dmIiIjIesmW3GRnZ0OlUsHHx0en3MfHB1lZWXr3+fvvv7Fp0yaoVCr8+OOPmDZtGj755BP885//LPN95s6dCw8PD+0WGBho0uMgIiKi6kX2AcXGUKvVqF+/Pr744gtEREQgLi4OU6ZMwYoVK8rcZ/LkycjJydFuly9ftmDEREREZGmyDSj28vKCra0trl27plN+7do1+Pr66t3Hz88P9vb2sLW11ZY1b94cWVlZePjwIRwcHErto1QqoVQqTRs8ERERVVuytdw4ODggIiICSUlJ2jK1Wo2kpCR06NBB7z6dOnXC+fPnoVartWV//vkn/Pz89CY2REREVPvI2i01fvx4fPnll/j6669x9uxZjBo1Cvn5+Rg2bBgAYMiQIZg8ebK2/qhRo3Dr1i2MHTsWf/75J7Zv3445c+Zg9OjRch0CERERVTOyrnMTFxeHGzduYPr06cjKykLr1q2xc+dO7SDjS5cuwcamKP8KDAzETz/9hHfffRetWrWCv78/xo4di4kTJ8p1CERERFTNyLrOjRy4zg0REVHNUyPWuSEiIiIyByY3REREZFWY3BAREZFVYXJDREREVoXJDREREVkVJjdERERkVZjcEBERkVVhckNERERWhckNERERWRUmN0RERGRVmNwQERGRVWFyQ0RERFaFyQ0RERFZFSY3REREZFWY3BAREZFVYXJDREREVoXJDREREVkVJjdERERkVZjcEBERkVVhckNERERWhckNERERWRUmN0RERGRVmNwQERGRVWFyQ0RERFaFyQ0RERFZFSY3REREZFWY3BAREZFVYXJDREREVsVO7gCshUoF7N0LZGYCfn5AVBRgayt3VERERLUPkxsTSEgAxo4FrlwpKgsIABYvBmJj5YuLiIioNmK3VBUlJAD9+ukmNgCQkSGVJyTIExcREVFtxeSmClQqqcVGiNLPacrGjZPqERERkWUwuamCvXtLt9gUJwRw+bJUj4iIiCyDyU0VZGaath4RERFVHZObKvDzM209IiIi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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.clf()   # 清除数字\n",
    "\n",
    "plt.plot(epochs, acc, 'bo', label='Training acc')\n",
    "plt.plot(epochs, val_acc, 'b', label='Validation acc')\n",
    "plt.title('Training and validation accuracy')\n",
    "plt.xlabel('Epochs')\n",
    "plt.ylabel('Accuracy')\n",
    "plt.legend()\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "注意训练损失值随每一个 epoch 下降而训练准确率（accuracy）随每一个 epoch 上升。这在使用梯度下降优化时是可预期的——理应在每次迭代中最小化期望值。\n",
    "\n",
    "验证过程的损失值（loss）与准确率（accuracy）的情况却并非如此——它们似乎在 20 个 epoch 后达到峰值。这是过拟合的一个实例：模型在训练数据上的表现比在以前从未见过的数据上的表现要更好。在此之后，模型过度优化并学习特定于训练数据的表示，而不能够泛化到测试数据。\n",
    "\n",
    "对于这种特殊情况，我们可以通过在 20 个左右的 epoch 后停止训练来避免过拟合。稍后，您将看到如何通过回调自动执行此操作。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "tensorflow",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.16"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
